2016-09-01 2 views
0

Использование: Grunt 1.01, load-grunt-config, jit-grunt.Изменение конфигурации, видимое для последующих задач

Я ищу простой способ установить флаг разработки/производства для использования в определенных задачах Grunt.

Первой задачей, которой нужен флаг, является webpack.js, чтобы переключаться между сборками разработки и производства React. Вот этот файл:

module.exports = function(grunt) { 

    // Get the task that was invoked from the command line. 
    var theTask = process.argv[2]; 

    // Check to see if it's a production task. If so, change the 
    // `env` variable accordingly. 
    if (theTask !== undefined && theTask.indexOf('prod') === 0) { 
     grunt.config.set('env', 'production'); 
    } 

    return { 
     app: { 
      entry: './<%= siteInfo.build_dir %>/<%= siteInfo.temp_dir %>/<%= siteInfo.app_dir %>/<%= siteInfo.app_file %>.js', 
      output: { 
       path: '<%= siteInfo.build_dir %>/<%= siteInfo.temp_dir %>', 
       filename: '<%= siteInfo.bundle_file %>.tmp.js' 
      }, 
      stats: false, 
      failOnError: true, 
      progress: false, 
      plugins: [ 
       new webpack.DefinePlugin({ 
       'process.env.NODE_ENV': JSON.stringify(grunt.config.data.env) 
       }), 
      ] 
     } 
    } 

}; 

В контексте этой задачи он отлично работает. Если я запустил grunt prod, тогда правильная версия React будет включена в комплект JS.

Однако я был под (безусловно) ошибочным впечатлением, что, установив переменную env с помощью grunt.config.set, это обновление для объекта конфигурации Grunt будет доступно для последующих задач.

Как я выяснил, env is undefined если я console.log(grunt.config.data.env) в другой задаче.

Любые указатели или предложения по альтернативным подходам оценены!

ответ

1

Вместо возвращения конфигурации, попробуйте следующее:

Создать задачу предварительно сборки, которая устанавливает любые конфигурации/варианты до запуска ваших задач. Вы можете проверить, если задача прод или не проверив this.name, а затем, так как это простое значение, установите его с помощью grunt.option:

function preBuild() { 

    grunt.option('env', this.name === 'prod' ? 'production' : 'development'); 
    grunt.task.run(['task1', 'task2', task3']); 
} 

grunt.registerTask('prod', preBuild); 
grunt.registerTask('dev', preBuild); 

Использование шаблона вот-тире, вы можете передать значение параметра в вашей конфигурации , Grunt компилирует строки шаблона lo-dash, когда запускается задача, к которой он выполняется:

grunt.initConfig({ 
    app: { 
     entry: './<%= siteInfo.build_dir %>/<%= siteInfo.temp_dir %>/<%= siteInfo.app_dir %>/<%= siteInfo.app_file %>.js', 
     output: { 
      path: '<%= siteInfo.build_dir %>/<%= siteInfo.temp_dir %>', 
      filename: '<%= siteInfo.bundle_file %>.tmp.js' 
     }, 
     stats: false, 
     failOnError: true, 
     progress: false, 
     plugins: [ 
      new webpack.DefinePlugin({ 
      'process.env.NODE_ENV': "<%= grunt.option('env') %>" 
      }), 
     ] 
    } 
}); 
+0

Пятно на! Я попробовал аналогичный подход, прежде чем я опубликовал его, но с немного другого ракурса, но он не сработает, этот работает. Приветствую человека! – davetgreen

+0

Единственная проблема, с которой я столкнулся, состоит в том, что '<% = grunt.option ('env')%>' не работает в моих подпрограммах, хотя я предполагаю, что это больше связано с тем, что я использую нагрузку -grunt-конфигурации? – davetgreen

+0

Я так не думаю? Я не использую этот плагин, потому что я написал свою собственную функцию для загрузки модульных файлов конфигурации, и у меня есть шаблоны с тире – theaccordance

Смежные вопросы