更新
我目前正在使用类似于此处描述的错误通知的解决方案,以及下面的“当前解决方法”(不修改 gruntforce
选项)用于成功通知。
原始问题
我无法确定grunt-contrib-watch运行的子任务何时完成(成功与否)。
具体来说,我使用grunt-contrib-coffee和 grunt watch 来编译我的 CoffeeScript 文件,因为它们发生了变化。编译工作正常。
我想做的是通知自己编译的状态。这是我尝试过的(CS中的所有代码):
当前的解决方法
来自 SO 问题(如果 Grunt 任务的其中一个子任务失败,我该如何让其失败?)
我不喜欢的是:设置和恢复全局选项似乎很笨拙,尤其是因为它发生在不同的任务/事件处理程序中。另外,我每次都必须删除目标文件。
在不设置全局选项的情况下,我可以通知编译成功,这很好,但我也想通知编译失败。
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 从程序中获取错误代码)所建议的那样,我使用了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。- 任何涉及指定“watch.coffee.tasks”选项的
grunt.initConfig
操作都不起作用,因为“coffee:dev”任务是在“watch”事件处理程序完成后运行的。 grunt.task.current
当然,总是指“监视”任务
如果你已经做到了这一点,感谢阅读:)。