如何在 grunt 任务完成后打印文本?

9

当一个Grunt任务完成后,我想打印一些信息。请查看下面的Grunt代码片段。

有没有办法实现这个呢?我注意到grunt.task.run()不支持回调函数。这会导致我的消息在报告输出之前被打印出来。

grunt.registerTask('coverage', 'Runs all unit tests available via Mocha and generates code coverage report', function() {
    grunt.task.run('env:unitTest', 'mochaTest');

    grunt.log.writeln('Code coverage report was generated into "build/coverage.html"');
});

我也希望避免使用“hack”,例如仅为打印信息而创建grunt任务,并将其添加到任务链中的grunt.task.run()

每个任务本身难道不应该负责打印它想要的信息吗? - hereandnow78
是的,那将是一个理想的方式。问题在于代码覆盖率任务是一个Grunt模块,它没有选项可以提供一些文本消息以打印。 - Pavel Lobodinský
2个回答

19
创建一个当所有任务都完成后运行的任务,然后将其添加到您的任务链中:

创建一个当一切都完成时运行的任务,然后将其添加到任务链中:

grunt.registerTask('alldone', function() {
  grunt.log.writeln('Code coverage report was generated into "build/coverage.html"');
});
grunt.registerTask('default', ['env:unitTest', 'mochaTest', 'alldone']);

我本来想通过创建特殊任务来避免这样的解决方法,只是为了打印信息。然而,由于还没有找到更好的方法,我最终还是这样做了 :( - Pavel Lobodinský
我也曾经为此苦恼。我想不允许用户在依赖列表中包含函数调用一定有其合理的原因...虽然我对此并不满意,但我的解决方案是编写一个 Bash 脚本,在我的任务周围进行前后日志记录。 - pdoherty926
2
Grunt是一个JavaScript任务运行器,因此几乎所有关于如何在Grunt中执行某些操作的问题的最佳答案是:使用任务。 - Kyle Robinson Young

4

有一种更好的方法可以做到这一点,而不需要创建额外的任务或修改其他任何内容。

Grunt是一个node进程,因此您可以:

  • 使用进程stdout来输出所需内容
  • 订阅进程exit事件,在任务完成执行时执行操作

下面是一个简单的示例,它会在任务完成执行后打印出时间:

module.exports = function (grunt) {
    // Creates a write function bound to process.stdout:
    var write = process.stdout.write.bind(process.stdout);

    // Subscribes to the process exit event...
    process.on("exit", function () {
        // ... to write the information in the process stdout
        write('\nFinished at ' + new Date().toLocaleTimeString()+ '\n');
    });

    // From here, your usual gruntfile configuration, without changes
    grunt.initConfig({

当你执行任何任务时,你会在底部看到如下信息:

18:26:45 完成


这是任务完成的时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接