更新
我目前正在使用类似于描述here的解决方案来获取错误通知,并在下面使用“当前解决方法”(不修改grunt force
选项)以获取成功通知。
原始问题
我无法确定grunt-contrib-watch运行的子任务何时完成(成功与否)。
具体来说,我正在使用grunt-contrib-coffee和grunt watch来编译我们改变的CoffeeScript文件。编译工作正常。
我想做的是通知自己编译的状态。这是我尝试过的(CS中的所有代码):
从SO问题(How can I make a Grunt task fail if one of its sub tasks fail?)
我不喜欢:设置和恢复全局选项似乎很笨拙,特别是因为它发生在不同的任务/事件处理程序中。另外,我每次都要删除目标文件。
如果没有设置全局选项,我可以通知一个成功的编译,这很好,但我也想通知一个失败的编译。
grunt.initConfig
watch:
options: nospawn: true
coffee:
files: '<%= coffee.dev.cwd %>/<%= coffee.dev.src %>'
options:
events: ['changed', 'added']
coffee:
dev:
expand: true
cwd: 'app'
src: '**/*.coffee'
dest: 'public'
ext: '.js'
grunt.registerTask 'completedCompile', (srcFilePath, destFilePath) ->
grunt.option 'force', false
if grunt.file.exists( destFilePath )
# notify success
else
# notify failure
grunt.event.on 'watch', (action, filepath) ->
if grunt.file.isMatch grunt.config('watch.coffee.files'), filepath
filepath = # compose source filepath from config options (omitted)
dest = # compose destination filepath from config options (omitted)
if grunt.file.exists( dest )
grunt.file.delete dest # delete the destination file so we can tell in 'completedCompile' whether or not 'coffee:dev' was successful
grunt.option 'force', true # needed so 'completedCompile' runs even if 'coffee:dev' fails
grunt.config 'coffee.dev.src', filepath # compile just the one file, not all watched files
grunt.task.run 'coffee:dev'
grunt.task.run 'completedCompile:'+filepath+':'+dest # call 'completedCompile' task with args
根据另一个SO问题(Gruntfile getting error codes from programs serially)的建议,我使用了grunt.util.spawn
。
这很有用,但速度很慢(每次保存CS文件时都会持续几秒钟)。
grunt.event.on 'watch', (action, filepath) ->
if grunt.file.isMatch grunt.config('watch.coffee.files'), filepath
filepath = # compose source filepath from config options (omitted)
dest = # compose destination filepath from config options (omitted)
if grunt.file.exists( dest )
grunt.file.delete dest # delete the destination file so we can tell in 'completedCompile' whether or not 'coffee:dev' was successful
grunt.util.spawn {
grunt: true # use grunt to spawn
args: ['coffee:dev']
options: { stdio: 'inherit' } # print to same stdout
}, -> # coffee:dev finished
if grunt.file.exists( dest )
# notify success
else
# notify error
我尝试了很多东西。
grunt.fail.errorcount
(在'completedCompile'任务中使用时)如果先前的编译失败则不为零。 (手动将其重置为零是否安全?如果是,我不必每次都删除dest文件。)即便如此,这需要将全局选项'force'设置为true。grunt.initConfig
中指定'watch.coffee.tasks'选项的内容都不起作用,因为'coffee:dev'任务是在'watch'事件处理程序完成后运行的。grunt.task.current
总是指“观察”任务,当然
如果你已经做到这一点,感谢阅读:)。
答案 0 :(得分:1)
我也遇到了同样的问题,试图找出监视子任务何时完成。
问题的一部分似乎是Watch默认会生成一个新的Grunt进程来运行子任务。因此,您的主要Grunt流程将无法了解完成的任务。您可以设置'nospawn',但这并没有多大帮助,因为手表不会公开子任务本身。
我最接近的是使用Grunt.util.hooker(受Grunt Notify启发)在Grunt失败'报告'方法被调用时作出反应。
grunt.util.hooker.hook(grunt.fail, 'report', function(){});
但是,这里没有关于已完成的实际任务的信息,如果您想根据监视任务中的特定子任务执行某些操作,这将非常有用。
看看Grunt Watch github,似乎有一些牵引力来实现完整/失败事件: https://github.com/gruntjs/grunt-contrib-watch/issues/131
答案 1 :(得分:0)
我认为Grunt-Notify会做你想要的。