红宝石耙卫任务

时间:2013-04-10 07:12:20

标签: ruby rake guard

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

  ##
  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

我尝试了不同的黑客,这里有太多不能提及,但所有人都返回了上面的Guard::copy - cannot copy, no valid :to directoriesdist目录肯定存在。此外,如果我从外壳,内部耙或cmd线上调用后卫,那么它运行完美,但留给我guard >外壳。认为我的问题可能是rake文件中的语法错误?任何帮助赞赏;)

1 个答案:

答案 0 :(得分: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改进它。