包含多个生成任务的Grunt任务将仅运行第一个任务

时间:2016-06-02 13:27:53

标签: javascript gruntjs spawn

我设置了以下三个任务,使用grunt.util.spawn来处理各种Git任务:

grunt.registerTask('git-add', function() {
  grunt.util.spawn({
    cmd : 'git',
    args: ['add', '.'],
  });
});

grunt.registerTask('git-commit', function(message) {
  grunt.util.spawn({
    cmd : 'git',
    args: ['commit', '-m', message],
  });
});

grunt.registerTask('git-push', function(origin, branch) {
  grunt.util.spawn({
    cmd : 'git',
    args: ['push', origin, branch],
  });
});

单独运行这些中的每一个都按预期工作,因此运行:

$ grunt git-add
$ grunt git-commit:"commit message"
$ grunt git-push:origin:"branch name"

我可以成功提交并推送我的更改。那么为什么将这三个任务组合到他们自己的任务中,只有第一个任务(git-add)才能运行?

var target = grunt.option('target');

grunt.registerTask('push-feature', [
  'git-add',
  'git-commit:' + target,
  'git-push:origin:feature/' + target
]);

我应该能够运行$ grunt push-feature --target=12345,假设我的分支被称为12345,运行所有这3个任务,但只运行第一个git-add任务。如果我删除git-add任务,下一个(git-commit)是唯一执行的任务。

我能错过的是能够按顺序运行这3个任务吗?

1 个答案:

答案 0 :(得分:1)

这可能是由于异步问题造成的。

尝试在声明任务时将任务标记为异步,并使用spawn的回调选项。这是第一个任务的例子:

grunt.registerTask('git-add', function () {

    var done = this.async(); // Set the task as async.

    grunt.util.spawn({
        cmd: 'git',
        args: ['add', '.']   // See comment below about this line
    }, done);                // Add done as the second argument here.
});

另请注意,您有一个额外的逗号,可能会干扰操作:

args: ['add', '.'], // <- this comma should be dropped.