所以这是我假设的fooTask的假设配置对象,它对一堆JS文件做了一些事情(与问题无关)
grunt.initConfig({
fooTask: {
app1: 'app1/*.js',
app2: 'app2/*.js',
app3: 'app3/*.js'
}
});
正如您所看到的,使用这种方法,我必须在指定为目标的每个应用程序中运行fooTask 3次:
grunt fooTask:app1
grunt fooTask:app2
grunt fooTask:app3
毋庸置疑,随着应用数量的增加或此类foo任务的数量增加,这不会扩展,因为每个应用必须为C& P反复使用相同的代码。
理想情况下,我想要定义的只是一个目标,其中app作为配置变量传入
grunt.initConfig({
fooTask: {
dist: '<%=appName%>/*.js'
}
});
然后我想调用fooTask 3次,每个应用程序一个,将正确的app设置为appName
var apps = ['app1', 'app2', 'app3'];
apps.forEach(function(app) {
var currAppName = app;
// Run fooTask but how do I specify the new currAppName config?
grunt.task.run('fooTask');
});
从上面的代码开始,我知道我可以使用grunt.task.run
运行我的fooTask但是如何为我的任务设置appName配置?
请注意,这个问题与另一个问题类似,但也没有正确答案 - Pass Grunt config options from task.run
非常感谢。
答案 0 :(得分:0)
编辑2:
所以永远不要在第一次编辑之下找到垃圾,留下不起作用的例子。在我的情况下,能够在运行时在任务中设置值非常重要,因此我确定了文件系统。也许它适合您的需求。
grunt.initConfig({
someTask: {
someKey: fs.readFileSync('file.txt', { encoding: 'utf8' })
}
});
当然,如果你需要一堆不同的应用程序名,你可以在任务之外执行readFile。
修改强> 嗯。我发誓,当我写这篇文章时,我有这个工作......但现在却没有。 Grunt只是将额外的参数视为额外的不完整任务。
我试图自己解决这个问题,最后只是发生了一个“呃” - 为什么不在grunt.initConfig
之前解析process.argv
?
module.exports = function(grunt) {
var sourcefile = process.argv[2] || 'default.js'; // <- this
grunt.initConfig({
uglify: {
main: {
src: sourcefile, // <- voila :)
dest: sourcefile.substring(0, sourcefile.length-3) + '.min.js'
}
}
});
grunt.loadNpmTasks('uglify');
grunt.registerTask('default', ['uglify']);
};
并从命令行使用:
grunt mykillerscript.js
我甚至没有尝试使用grunt.option,因为所有示例都只显示了指导哪个任务运行,但如果有更“笨拙”的方法,我不会感到惊讶。