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

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

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

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

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

$ grunt my-task --foo 'bar'

Это возможно?

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


person Nick Heiner    schedule 13.02.2013    source источник


Ответы (6)


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

grunt.config.set('task.options.foo', 'bar');
person jjt    schedule 23.09.2013

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

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

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

person Nick Heiner    schedule 13.02.2013
comment
Это не сработает, если вам нужно запустить 2 или более задач: / если у вас есть цикл и установлены grunt.option и grunt.task.run, обе задачи будут выполняться с последней итерацией grunt.option; @Rosarch, ты знал, как это решить? - person Rafael Verger; 23.04.2014
comment
@RafaelVerger вы можете создать две задачи: одну для запуска задачи и другую для изменения параметра. Ставьте задачи в очередь в чередующемся порядке, и они будут запускаться с правильно установленной опцией. - person rosswil; 29.05.2014
comment
Это работает, если у вас ограниченный набор опций; но когда вы получаете эти параметры динамически (например, запрашивая службу обнаружения для серверов с MySQL), это не сработает. - person Rafael Verger; 02.06.2014
comment
@RafaelVerger Вы можете поставить в очередь списки аргументов в глобальном массиве, а затем .shift() пройти через них. Безумно уродливый, но, кажется, это обычное дело для Grunt. - person Hans; 16.12.2015

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

grunt.registerTask('build_prod', 'Build with production options', function () {
  grunt.config.set('assemble.options.production', true);
  grunt.task.run('build');
});
person Alessandro Pezzato    schedule 28.07.2014
comment
Это правильный способ достижения желаемой функциональности. - person nikk wong; 01.12.2015

В дополнение к @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

Они оба будут выполнять полную задачу 'сборки' и, соответственно, передавать значение одной из опций сборки, а именно производство «истинно» или «ложно».


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

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

person Remi    schedule 21.04.2015
comment
Это здорово. Вы также можете определить, какие задачи выполняются в различных параметрах, передав список задач непосредственно команде запуска (например, другая команда build-dev, которая может пропустить clean и cssmin): grunt.task.run(['clean:dist' , 'собрать', 'компас:расстояние', 'cssmin', 'копировать:основной']); - person AJ Zane; 04.06.2016

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

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

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

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

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

person guy mograbi    schedule 03.01.2016

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

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

Приведет к тому, что цвет синий будет зарегистрирован дважды.

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

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

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

person nimblengineer    schedule 03.11.2015