2

Ruby noob - 我需要在我的 rake 任务中运行警卫,但我找不到让它在后台运行的方法。它需要最后运行第二个,因此让guard >shell 等待命令会阻止最终任务运行,因此sh bundle exec guard不能选择调用 rake 文件。根据文档,这应该有效:

  ##
  desc "Watch files"
  ##
  task :watcher do
    Guard.setup
    Guard::Dsl.evaluate_guardfile(:guardfile => 'Guardfile', :group => ['Frontend'])
    Guard.guards('copy').run_all
  end
  #end watch files

https://github.com/guard/guard/wiki/Use-Guard-programmatically-cookbook

这是我的完整 Guardfile(与 Rakefile 在同一目录中)

# Any files created or modified in the 'source' directory
# will be copied to the 'target' directory. Update the
# guard as appropriate for your needs.
guard :copy, :from => 'src', :to => 'dist', 
            :mkpath => true, :verbose => true

rake watcher返回错误:

07:02:31 - INFO - Using Guardfile at Guardfile.
07:02:31 - ERROR - Guard::Copy - cannot copy, no valid :to directories
rake aborted!
uncaught throw :task_has_failed

我尝试了不同的 hack,这里就不多说了,但都返回了上面的Guard::copy - cannot copy, no valid :to directories. 该dist目录肯定存在。此外,如果我从 shell、rake 内部或在 cmd 行上调用 guard,那么它运行完美,但让我留下了guard >shell。认为我的问题可能是 rake 文件中的语法错误?任何帮助表示赞赏;)

4

1 回答 1

2

Guard Copy 在#start方法中做了一些初始化,所以你需要先启动 Guard 才能运行它:

task :watcher do
  Guard.setup
  copy = Guard.guards('copy')
  copy.start
  copy.run_all
end

另外没有必要再打电话Guard::Dsl.evaluate_guardfile了,维基上的信息已经过时了。

编辑1:继续关注

当你想看目录时,你需要启动Guard:

task :watcher do
  Guard.start
  copy = Guard.guards('copy')
  copy.start
  copy.run_all
end

注意:如果您设置 Guard在之后启动它,则 Guard 会失败并显示Hook with name 'load_guard_rc'

编辑2:真的继续看

Guard 以非阻塞模式启动Listen ,所以为了使调用阻塞,你需要等待它:

task :watcher do
  Guard.start
  copy = Guard.guards('copy')
  copy.start
  copy.run_all
  while ::Guard.running do
    sleep 0.5
  end
end

如果您还想禁用交互,您可以传递no_interactions选项:

Guard.start({ no_interactions: true })

API 绝对不是最佳的,当我们删除 Ruby 1.8.7 支持和一些已弃用的东西时,我会为 Guard 2 改进它。

于 2013-04-10T13:40:09.077 回答