我正在尝试创建一个Jade任务,它将具有一个构建和开发任务,它具有非常相似的选项,除了dev boolean和一个不同的目标。我能够实现这一目标的最简单方法是:
jade: {
dev: {
options: {
data: {
dev: true, // dev true
config: ...,
pkg: ...,
helpers: ...
}
},
files: [{
dest: '<%= config.workingDir %>',
...
}]
},
build: {
options: {
data: { // no dev
config: ...,
pkg: ...,
helpers: ...
}
},
files: [{
dest: '<%= config.buildDir %>',
...
}]
}
}
虽然有很多重复,特别是如果我想在赛道上添加更多选项。所以我正在尝试创建一个可以从命令行和监视任务工作的构建任务。
我得到的最接近的是这个设置,我可以从命令行运行grunt jade --dev
但不能在监视任务中设置dev boolean。
build: {
options: {
data: {
dev: '<%= grunt.option("dev") %>',
config: ...,
pkg: ...,
helpers: ...
}
},
files: [{
dest: '<%= grunt.option("dev") ? config.workingDir : config.buildDir %>',
...
}]
}
观察任务:
watch: {
jade: {
...
tasks: ['jade'] // the option is false
}
}
我还尝试创建一个自定义任务来设置选项,然后运行watch,在收听监视事件时我可以看到该选项已正确设置
grunt.registerTask('dev', 'Grunt dev mode', function(){
grunt.option('dev', true);
grunt.task.run('watch');
});
grunt.event.on('watch', function(action, filepath, target) {
console.log(grunt.option('dev')); // true
});
即使日志显示dev boolean为true,也会传递错误的任务选项。所以,尽管如此,我是否正在以正确的方式设置选项,还是我只是坚持使用重复相同信息的构建和开发任务?
我也尝试过使用grunt.util ._。expand方法,但收效甚微。
data: "<%= grunt.util._.extend(jade.options.data, {dev: true}) %>",
答案 0 :(得分:2)
您可以在task
级别指定options
作为默认值,然后在{{1}进一步指定target
(dev vs build)特定options
水平。这样您就可以避免在多个target
:
targets
更新
根据jade: {
options : {
config: ...,
pkg: ...,
helpers: ...
},
dev: {
options: {
dev : true
},
files: [{
dest: '<%= config.workingDir %>',
...
}]
},
build: {
files: [{
dest: '<%= config.buildDir %>',
...
}]
}
}
案例中的评论,所有选项都必须位于jade
中,如果使用上述方法,则本地data
将完全覆盖全局{{} {1}},你可以这样做,因为Gruntfile.js只是JavaScript:
data
然后在任务配置中使用这样的方法:
data
请注意,此代码未经过测试。
作为旁注,您可能无法看到var dataConfigBuild = {
config: ...,
pkg: ...,
helpers: ...
};
//use your favorite way of "cloning" an object
var dataConfigDev = {};
for(var propName in dataConfigBuild) {
dataConfigDev[propName] = dataConfigBuild[propName];
}
//and add the dev specific stuff
dataConfigDev.dev = true;
相关代码中没有看到预期配置的原因,因为您需要设置spawn : false
。