Программно задавать параметры для задания grunt? - программирование
Подтвердить что ты не робот

Программно задавать параметры для задания grunt?

У меня есть задача grunt, которая рассматривает опции с grunt.option('foo'). Если я вызываю эту задачу из grunt.task.run('my-task'), как я могу изменить эти аргументы?

Я ищу что-то вроде:

grunt.task.run('my-task', {foo: 'bar'});

который был бы эквивалентен:

$ grunt my-task --foo 'bar'

Возможно ли это?

(Этот вопрос - это еще одна проблема, с которой я столкнулся, но не совсем то же самое, потому что в этом случае у меня нет доступа к исходной задаче Gruntfile. JS.)

4b9b3361

Ответ 1

Похоже, я могу использовать следующее:

grunt.option('foo', 'bar');
grunt.task.run('my-task');

Немного странно задавать параметры глобально, а не только для этой команды, но это работает.

Ответ 2

Если вы можете использовать опцию конфигурации на основе задач вместо grunt.option, это должно работать, чтобы дать вам более подробный контроль:

grunt.config.set('task.options.foo', 'bar');

Ответ 3

Создайте новую задачу, которая установит этот параметр, затем вызовите измененную задачу. Это пример реальной жизни с assemble:

grunt.registerTask('build_prod', 'Build with production options', function () {
  grunt.config.set('assemble.options.production', true);
  grunt.task.run('build');
});

Ответ 4

В дополнение к @Alessandro Pezzato

Gruntfile.js:

grunt.registerTask('build', ['clean:dist', 'assemble', 'compass:dist', 'cssmin', 'copy:main']);

    grunt.registerTask('build-prod', 'Build with production options', function () {
        grunt.config.set('assemble.options.production', true);
        grunt.task.run('build');
    });

    grunt.registerTask('build-live', 'Build with production options', function () {
        grunt.option('assemble.options.production', false);
        grunt.task.run('build');
    });

Теперь вы можете запустить

$ grunt build-prod

-OR-

$ grunt build-live

Они оба сделают полную задачу "build" и соответственно передадут значение одному из вариантов сборки, а именно: "true", или "false".


В дополнение к иллюстрации примера сборки немного больше:

В сборке вы можете добавить {{#if production}}do this on production{{else}}do this not non production{{/if}}

Ответ 5

grunt - все программно.. поэтому, если вы уже задали параметры для задач, вы сделали это программно.

просто используйте grunt.initConfig({ ... }) для установки параметров для задач.

и если вы уже инициализировали и вам нужно изменить конфигурацию впоследствии, вы можете сделать что-то вроде

grunt.config.data.my_plugin.goal.options = {};

Я использую его для своего проекта, и он работает.

Ответ 6

Недавно я столкнулся с этой же проблемой: программно задавать параметры grunt и запускать задачи несколько раз из одной родительской задачи. Как упоминает @Raphael Verger, это невозможно, так как grunt.task.run откладывает выполнение задачи до завершения текущей задачи:

grunt.option('color', 'red');
grunt.task.run(['logColor']);
grunt.option('color', 'blue');
grunt.task.run(['logColor']);

В результате дважды будет записываться синий цвет.

После некоторого вовлечения, я придумал задачу grunt, которая позволяет динамически указывать другую опцию/конфигурацию для каждой подзадачи, которая будет запущена. Я опубликовал задачу как grunt-galvanize. Вот как это работает:

var galvanizeConfig = [
  {options: {color: 'red'}, configs: {}},
  {options: {color: 'blue'}, configs: {}}
];
grunt.option('galvanizeConfig', galvanizeConfig);
grunt.task.run(['galvanize:log']);

При этом заголовок будет красным, а затем синим, если нужно, запустив задачу журнала с каждой из опций/конфигов, указанных в galvanizeConfig.