所以这是我的假设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相同的代码。

因此,理想情况下,我只想定义一个目标,并将应用程序的名称作为配置变量传入
grunt.initConfig({
  fooTask: {
    dist: '<%=appName%>/*.js'
  }
});

然后,我想调用fooTask 3次,每个应用一次,将正确的应用设置为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

非常感谢。

最佳答案

编辑2:

因此,请不要在第一个编辑下面忽略垃圾,仅作为不起作用的示例。就我而言,在运行时能够在任务中设置值非常重要,因此我选择了文件系统。也许它适合您的需求。

grunt.initConfig({
  someTask: {
    someKey: fs.readFileSync('file.txt', { encoding: 'utf8' })
  }
});

当然,如果您需要一堆不同的应用程序名称,则可以在任务之外执行readFile。

编辑:
嗯我发誓我在写这篇文章时已经在工作了……但是现在不是。 Grunt只是将额外的参数视为额外的未找到的任务。

我试图自己弄清楚这一点,最后一刻发生了“duh”-为什么不先将 process.argv 解析为grunt.initConfig呢?
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,其原因是所有示例仅显示了直接执行哪个任务的理由,但是如果有更“grunt”的方式来执行此操作,我也不会感到惊讶。

关于javascript - Grunt-在运行任务之前动态设置配置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23417598/

10-16 21:59