18

为了自定义我的 grunt 任务,我需要在启动 grunt 时访问命令行中给出的 grunt 任务名称。

选项没有问题,因为它有据可查(grunt.options)。在运行 grunt task 时如何找出任务名称也有很好的记录。

但我之前需要访问任务名称。

例如,用户写 grunt build --target=client

在我的 中配置 grunt 作业时Gruntfile.js,我可以使用 grunt.option('target')来获取'client'.

但是如何build在任务构建开始之前获取参数呢?

非常感谢任何指导!

4

3 回答 3

28

您的 grunt 文件基本上只是一个函数。尝试将此行添加到顶部:

module.exports = function( grunt ) {
/*==> */    console.log(grunt.option('target'));
/*==> */    console.log(grunt.cli.tasks);

// Add your pre task code here...

运行grunt build --target=client应该会给你输出:

client
[ 'build' ]

此时,您可以在运行任务之前运行所需的任何代码,包括使用新依赖项设置值。

于 2013-06-11T19:49:37.353 回答
3

更好的方法是使用grunt.task.currentwhich 具有有关当前正在运行的任务的信息,包括name属性。在一个任务中,上下文(即this)是同一个对象。所以 。. .

grunt.registerTask('foo', 'Foobar all the things', function() {
  console.log(grunt.task.current.name); // foo
  console.log(this.name); // foo
  console.log(this === grunt.task.current); // true
});

如果build是其他任务的别名,而您只想知道输入了导致当前任务执行的命令,我通常使用process.argv[2]. 如果您检查process.argv,您会看到argv[0]is node(因为grunt是一个node进程),argv[1]is grunt,并且argv[2]是实际的 grunt 任务(后面是 的其余部分中的任何参数argv)。

编辑:

来自任务内的console.log(grunt.task.current)grunt@0.4.5的示例输出(不能有来自非当前任务的当前任务)。

{
  nameArgs: 'server:dev',
  name: 'server',
  args: [],
  flags: {},
  async: [Function],
  errorCount: [Getter],
  requires: [Function],
  requiresConfig: [Function],
  options: [Function],
  target: 'dev',
  data: { options: { debugPort: 5858, cwd: 'server' } },
  files: [],
  filesSrc: [Getter]
}
于 2015-01-31T22:29:49.927 回答
1

你可以用grunt.util.hooker.hook这个。

示例(Gruntfile.coffee 的一部分):

grunt.util.hooker.hook grunt.task, (opt) ->
  if grunt.task.current and grunt.task.current.nameArgs
    console.log "Task to run: " + grunt.task.current.nameArgs

指令

C:\some_dir>grunt concat --cmp my_cmp
Task to run: concat
Running "concat:coffee" (concat) task
Task to run: concat:coffee
File "core.coffee" created.

Done, without errors.

还有一个我用来阻止某些任务执行的技巧:

grunt.util.hooker.hook grunt.task, (opt) ->
  if grunt.task.current and grunt.task.current.nameArgs
    console.log "Task to run: " + grunt.task.current.nameArgs
    if grunt.task.current.nameArgs is "<some task you don't want user to run>"
      console.log "Ooooh, not <doing smth> today :("
      exit()  # Not valid. Don't know how to exit :), but will stop grunt anyway

CMD,当允许时

C:\some_dir>grunt concat:coffee --cmp my_cmp
Running "concat:coffee" (concat) task
Task to run: concat:coffee
File "core.coffee" created.

Done, without errors.

CMD,当被阻止时

C:\some_dir>grunt concat:coffee --cmp my_cmp
Running "concat:coffee" (concat) task
Task to run: concat:coffee
Ooooh, not concating today :(
Warning: exit is not defined Use --force to continue.

Aborted due to warnings.
于 2013-06-14T14:20:39.170 回答