我正在使用 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 themesObject 中的 new_key ) {
此处链接的代码:
无论如何都无法正常工作的相关位如下:
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 tasks 和所有的活...应该是这样的:
|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.
我暗暗怀疑 grunt 不会让我动态定义 initConfig
以按照我想要的方式用 for
循环填充空白。 .. 任何对此的启示将不胜感激!
更新:自从最初发布问题以来,我已经了解了 initConfig
中 themes
的动态分配工作的地步预期,但截至目前,模板正在回应我想要的,但任务本身没有运行。我在每个 multiTask
中记录结果(请参阅此处的代码 - http://jsfiddle.net/6XKrp/2/ )并获得 this.data
的预期结果(我想要特定于主题的命令->template),但是定义的 Action 没有执行。
更新 2:事情正在按预期进行记录,现在正在注册任务,问题是它们没有执行,或者只是没有递归地执行到 JSON 对象的更深层次, 不确定为什么...以这种方式调用时 grunt.js
不会递归执行吗?
最佳答案
本质上,我的做法是错误的,没有意识到 JSON 结构在顶层是不可协商的。您可以在顶级函数下嵌套可选和/或多个文件、输出等,但这些顶级 JSON 数据项是为 native 函数和扩展保留的。
以下是我如何完成上述内容的要点: https://gist.github.com/4294776
关于javascript - 使用 Grunt.js 迭代完全独特但重叠的主题文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13813004/