3

我正在使用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 ) {

http://jsfiddle.net/6XKrp/3/

无论如何都无法正常工作的相关位如下:

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执行以这种方式调用时递归?

4

1 回答 1

2

本质上,我做错了,没有意识到 JSON 结构在顶层是不可协商的。您可以在顶级函数下嵌套可选和/或多个文件、输出等,但这些顶级 JSON 数据项保留用于本机函数和扩展。

以下是我如何能够完成上述内容的要点: https ://gist.github.com/4294776

于 2012-12-15T13:31:05.100 回答