【问题标题】:guard-coffee seems to cause guard-shell to execute twice守卫咖啡似乎导致守卫外壳执行两次
【发布时间】:2023-09-03 17:32:01
【问题描述】:

我已经设置了警卫(红宝石宝石),并且在我的 Mac 上似乎可以正常工作,并且从警卫咖啡和警卫外壳中设置警卫似乎工作正常。下面是我的 Guardfile 的相关部分

guard 'coffeescript', :input => 'src/javascripts', :output => 'public/javascripts'
guard 'shell' do
    watch( %r{^public/.+\.(js|css)$} ) do |m|
        puts m.inspect
        if m[1] == 'js'
            puts 'a js is new!'
        else
            puts 'a css is new!'
        end
        puts %x{ echo #{File.mtime(m[0])} }
    end
end

如果我编辑咖啡脚本文件,这似乎会输出“a js is new”两次。随着调试它似乎运行后

13:39:23 - DEBUG - Hook :run_on_changes_begin executed for Guard::CoffeeScript
13:39:23 - INFO - Compile src/javascripts/blah.coffee
13:39:23 - INFO - 01:39:23 PM Successfully generated public/javascripts/blah.js
["public/javascripts/blah.js", "js"]
a js is new!

13:39:23 - DEBUG - Hook :run_on_changes_end executed for Guard::CoffeeScript
["public/javascripts/blah.js", "js"]
a js is new!

如果我直接编辑 blah.js 文件,它似乎只会触发一次。我对钩子的工作原理有点困惑,我可以从另一个守卫那里打钩吗?我应该在咖啡脚本守卫的回调中运行这段代码吗?我试图使用组,并且只在我在一个组中时才做外壳部分,并且不想在我使用回调的情况下重复咖啡卫士。

有什么想法可以在咖啡一开火时停止触发外壳防护装置两次?

【问题讨论】:

    标签: ruby coffeescript guard


    【解决方案1】:

    在 Guard 1.0.0 之前,从 Guard 插件创建和更新的新文件不会触发其他插件的后续文件更改。这是一个问题,例如 CoffeeScript 和 LiveReload 插件:当 JavaScript 文件被更新时,LiveReload 没有重新加载文件。作为一种解决方法,我添加了一些manual file trigger code。使用 Listen gem 时,此限制已被消除,因此 CoffeeScript 插件会触发两次文件更改。

    我在我的主分支上removed 它。在我发布新的 gem 之前,你能试一试吗?您可以使用我的 master 分支轻松做到这一点,方法是添加:

    gem 'guard-coffeescript', :github => 'netzpirat/guard-coffeescript', :branch => 'master'

    到您的Gemfile。当它工作正常时,我会尽快发布一个新的 gem。

    【讨论】:

    • 这似乎成功了!感谢您的跟进 :) 到目前为止,我很喜欢守卫,希望很快能深入研究它。此外,由于我刚刚进行了“捆绑更新”,因此我还取消了 1.5.1 防护,如果这也有任何影响的话。我这个周末要去旅行,否则我会早点看到的。