Grunt任务目标数组?

时间:2014-12-29 02:58:09

标签: javascript arrays gruntjs build-process

我可以将多个文件数组设置为目标:

task:{
    target:{
        files:[
            {
                expand:true,
                cwd:'client/',
                dest:'server/',
                src:[
                    'scripts/**/*.js',
                    'styles/**/*.css',
                    'images/**'
                ]
            },
            {
                expand:true,
                cwd:'client/assets/',
                src:'**/*',
                dest:'server/'
            }
        ]
    }
}

现在我想对目标做同样的事情。

像这样:

task:{
    server:[
        {
            options:{
                …
            },
            files:{
                …
            }
        },
        {
            options:{
                …
            },
            files:{
                …
            }
        }
    ]
}

但这对Grunt不起作用:

Warning: Object #<Object> has no method 'indexOf' Use --force to continue.

我该怎么做?

现在我使用这个方案做同样的事情:

task:{
    server_<subtask_one>:{
        options:{
            …
        },
        files:{
            …
        }
    },
    server_<subtask_second>:{
        options:{
            …
        },
        files:{
            …
        }
    }
}

但是为每个子任务重复任务前缀并将它们分成不同的行并不是很方便:

'dataSeparator:<target>_<subtask_one>',
'dataSeparator:<target>_<subtask_second>',

1 个答案:

答案 0 :(得分:0)

除非您想编写自定义任务,否则这是您唯一的选择。但是大多数任务都允许您在任务级别指定options块,因此您至少可以节省一些重复:

task:{
    options:{
        // options common to all tasks
    },
    server_<subtask_one>:{
        options:{
            // override options if necessary
        },
        files:{
            // custom for this target
        }
    },
    server_<subtask_second>:{
        options:{
            // override options if necessary
        },
        files:{
            // custom for this target
        }
    }
}

正如我所说的,你可以编写一个自定义任务来动态重置每个目标的grunt config options,但这很麻烦,我不建议它......甚至不确定它是否能正常工作。

grunt.registerTask('mutli-task', 'Compile options and pass to task', function() {

    grunt.config.set('task.server_<subtask_one>.some_setting', 'value');
    // ...
    grunt.task.run('task');

    // Now do it again, but with different settings... maybe in a loop?
});