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 directories
。 dist
目录肯定存在。此外,如果我从外壳,内部耙或cmd线上调用后卫,那么它运行完美,但留给我guard >
外壳。认为我的问题可能是rake文件中的语法错误?任何帮助赞赏;)
答案 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
,维基上的信息已过时。
当你想观看目录时,你需要启动Guard:
task :watcher do
Guard.start
copy = Guard.guards('copy')
copy.start
copy.run_all
end
注意:如果您设置Guard 并之后启动它,那么Guard会失败并显示Hook with name 'load_guard_rc'
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改进它。