gpt4 book ai didi

gruntjs - Grunt watch - 检测任务的成功和失败

转载 作者:行者123 更新时间:2023-12-04 21:44:11 26 4
gpt4 key购买 nike

更新

我目前使用的解决方案类似于 here用于错误通知,以及下面的“当前解决方法”(不修改 grunt force 选项)用于成功通知。

原问题

我无法确定 grunt-contrib-watch 何时运行子任务已经完成(成功与否)。

具体来说,我正在使用 grunt-contrib-coffee并在我的 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总是指'watch'任务,当然

  • 如果你已经做到了这一点,感谢阅读:)。

    最佳答案

    我也遇到了同样的问题,试图弄清楚 watch 子任务何时完成。

    部分问题似乎是 Watch 默认情况下会产生一个新的 Grunt 进程来运行子任务。所以你的主要 Grunt 进程不会知道任务完成。您可以设置 'nospawn' 但这并没有多大帮助,因为 watch 不会公开子任务本身。

    我能做到的最接近的是使用 Grunt.util.hooker(受 Grunt Notify 启发)在调用 Grunt 失败“报告”方法时使用react。

    grunt.util.hooker.hook(grunt.fail, 'report', function(){});

    但是,这不包含有关已完成实际任务的信息,如果您想根据监视任务中的特定子任务执行某些操作,这将很有帮助。

    查看 Grunt Watch github 似乎有一些牵引力来实现完整/失败事件:
    https://github.com/gruntjs/grunt-contrib-watch/issues/131

    关于gruntjs - Grunt watch - 检测任务的成功和失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17351717/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com