我正在使用http://gruntjs.com/创建一个迭代themes.json
文件的构建脚本,JSON 包含如下所示:
{
"vintage" : {
"_name" : "vintage",
"_long_name" : "Vintage",
"_js_includes" : [
"assets/js/plugins/bootstrap/bootstrap-transition.js",
[...]
"assets/js/plugins/*.js",
"assets/js/_*.js"
]
},
"pure" : {
"_name" : "pure",
"_long_name" : "Pure",
"_js_includes" : [
"assets/js/plugins/bootstrap/bootstrap-transition.js",
[...]
"assets/js/plugins/bootstrap/bootstrap-popover.js",
"assets/js/plugins/*.js",
"assets/js/_*.js"
]
}, "mystique" : {
"_name" : "mystique",
"_long_name" : "Mystique",
"_js_includes" : [
[...]
"assets/js/plugins/*.js",
"assets/js/_*.js"
]
}
}
我正在grunt.initConfig
通过
grunt.initConfig({
themes: '<json:themes.json>',
[...]
方法,问题是mystique
我上面示例中数组中的最终主题以某种方式覆盖了我正在尝试编写的特定于主题的任务。我希望能够做到grunt themes:pure
并让它抓住我在此处链接的代码for
行中的循环内动态注册的动作:for ( var new_key in themesObject ) {
无论如何都无法正常工作的相关位如下:
for ( var key in themesObject ) {
initCommand = 'themes:'+themesObject[thisThemeName]._name; // --> themes:pure
taskString = themesObject[thisThemeName].taskString // --> lint pure:recess pure:concat pure:min pure:mincss pure:enqueue_ver
grunt.task.registerMultiTask( initCommand, taskString, function() {
grunt.log.writeln('Now executing task ['+this.target+'] for '+this.name+' theme...');
grunt.log.writeln( grunt.log.writeflags( this.data, this.target ) );
grunt.log.writeln( 'this.file = '+this.file);
})
上面的代码以initConfig
看起来正确并且themes:[my-theme]
应该正在执行的方式记录模板,但是,没有实际的命令执行发生,只有记录方面。
我是否需要将 taskString 传递给registerMultiTask
函数并在函数本身内重复任务字符串,例如:
registerMultiTask( initCommand, taskString, function( taskString ) { taskString })
函数然后grunt.task.run(taskString)
在每个注册函数里面做?我知道这种传递变量的方法旨在接收命令行输入,但是有没有办法将字符串传递给注册函数?
似乎它正在执行所有“平面”的东西,因为它正在执行 JSON 配置对象的顶级,但没有递归到更深层次的嵌套 JSON 执行应该发生的地方......我在这里吗?
对于任何好奇的人,这是 Twitter Bootstrap 的一些修改,基本上,这里的目标是动态创建子主题themes.json
并将它们导出到同级目录到 grunt 任务和所有内容所在的源......应该是这样的:
|source-directory
|--assets
|--|--css
|--|--|--bootstrap
|--|--|--|--less
|--|--scripts
|--|--|--plugins
|pure
|--assets
|--|--css
|--|--|--main.js
|--|--|--main.min.js
|--|--js
|--|--|--scripts.js
|--|--|--scripts.min.js
| vintage
|--assets
|--|--css
|--|--|--main.js
|--|--|--main.min.js
|--|--js
|--|--|--scripts.js
|--|--|--scripts.min.js
... etc.
我有一个偷偷摸摸的怀疑,不知何故咕噜不会让我动态地定义initConfig
以我打算的方式用循环填充空白for
......任何对此的解释将不胜感激!
更新themes
:自从最初发布问题以来,我已经达到了内部动态分配按预期工作的地步initConfig
,但截至目前,模板正在呼应我想要的,但任务本身没有运行。我在每个中记录结果multiTask
(请参见此处的代码 - http://jsfiddle.net/6XKrp/2/)并获得预期的结果this.data
(我想要特定于主题的命令->模板),但定义的操作没有执行。
更新 2:事情正在按预期记录,现在正在注册任务,问题是它们要么没有执行,要么只是没有递归执行到 JSON 对象的更深层次,不知道为什么......不grunt.js
执行以这种方式调用时递归?