2013-02-13 65 views
16

我有一个咕噜的任务,看grunt.option('foo')选项。如果我从grunt.task.run('my-task')调用此任务,我该如何更改这些参数?以编程方式为咕噜任务设置选项?

我在寻找类似:

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

这将是等价的:

$ grunt my-task --foo 'bar' 

这可能吗?

This question是另一个问题我跑中,但不是完全一样的,因为在这种情况下,我没有访问原始任务的Gruntfile.js。)

回答

12

看起来我可以使用以下:

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

在全局设置选项而不是仅仅为了该命令而感觉有点奇怪,但它起作用。

+0

如果你需要运行2个或多个任务,它将不起作用:/如果你有一个循环并设置'grunt.option'和'grunt.task.run',这两个任务都会运行在最后一次迭代的'grunt .option'; @Rosarch,你知道如何解决它吗? – 2014-04-22 22:27:57

+0

@RafaelVerger您可以创建两个任务,一个负责运行任务,另一个负责更改选项。按交替顺序排列任务,并且它们将在正确设置选项的情况下运行。 – rosswil 2014-05-29 04:27:37

+0

如果您有一套有限的选项,但是当你动态地获得这些选项时(例如使用MySQL查询服务器的发现)它将不起作用 – 2014-06-02 15:29:35

19

如果您可以使用基于任务的配置选项,而不是grunt.option,这应该给你更精细的控制:

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

创建其设置的选项了新的任务,然后调用修改后的任务。这是assemble一个现实生活中的例子:

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

这是实现所需功能的正确方法。 – 2015-12-01 20:59:45

+0

这应该是被接受的答案 – 2016-05-21 21:32:18

3

除了@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

- 或 -

$ grunt build-live

他们都将做充分的任务,“建设”和A值传递给options of assemble之一,即生产“真”或“假”。


除了说明组装例如多一点:

在组装必须添加一个{{#if production}}do this on production{{else}}do this not non production{{/if}}

+0

这应该是被接受的答案。 – 2015-12-01 21:00:21

+0

这太好了。您还可以通过将taskList直接传递给运行命令(例如,另一个可以跳过clean和cssmin的build-dev命令)来定义在不同选项中运行哪些任务: grunt.task.run(['clean: dist','assemble','compass:dist','cssmin','copy:main']); – 2016-06-03 21:12:38

0

我最近碰到了同样的问题的选项:编程设置咕噜选项和从单个父任务内多次运行任务。作为@Raphael韦尔热提到,这是不可能的,因为grunt.task.run推迟,直到当前任务完成任务的运行:

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

将导致颜色蓝色被记录两次。

经过一番捣鼓之后,我想出了一个咕task任务,允许为每个要运行的子任务动态指定不同的选项/配置。我已将该任务发布为grunt-galvanize。下面是它如何工作的:

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

这将记录红色然后蓝色,根据需要通过每个galvanizeConfig指定的选项/ CONFIGS的运行日志任务。

1

grunt是所有程序化的..所以如果你之前已经在任务上设置了选项,你已经通过编程完成了这个任务。

只需使用grunt.initConfig({ ... })来设置任务选项。

,如果你已经初始化,需要事后更改配置,你可以这样做

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

我使用它为我的项目和它的作品。