守卫 - 与流浪汉保持一致

时间:2015-02-26 23:38:39

标签: ruby-on-rails rspec vagrant guard

我正在尝试使用警卫的--listen-on选项和流浪者here,但我无法让它工作。

如果我向config.vm.network :forwarded_port, guest: 4000, host: 4000添加Vagrantfile并随后尝试使用listen -f 127.0.0.1:4000开始收听,则会收到错误:Broadcaster.initialize: Address already in use - bind(2) for "127.0.0.1" port 4000

如果我尝试开始听,然后然后开始流浪汉,那么流浪者也会抱怨:

  

Vagrant无法转发此VM上的指定端口,因为它们   会与正在收听的其他应用程序发生冲突   在这些港口。转发到4000的端口已在使用中   在主机上。

所以我在Vagrantfile中省略了端口4000转发时尝试了其他一些事情:

如果我在Vagrantfile中省略了端口4000转发,那么我可以成功开始使用listen -f 127.0.0.1:4000收听。但是当我在我的流浪客人中运行guard -o "10.0.2.2:4000" -w "/home/me/my_project/"时,当文件发生变化时,警卫不会做任何事情。在-v调用中添加listen标记表示在主机上正确选择了 的更改。

我还尝试在主机上listen -f 10.11.12.1:4000guard -o "10.11.12.1:4000" -w "/home/me/my_project/"上的listen -f 127.0.0.1:4000结合使用,当文件发生变化时,相同的后卫结果不会做任何事情。

guard -o "10.11.12.1:4000" -w "/home/me/my_project/"listen -vf 127.0.0.1:4000 # host ssh -R 4000:localhost:4000 vagrant@10.11.12.13 # connect guard -o "127.0.0.1:4000" -w "/home/me/my_project" # guest 相结合会导致警卫无法连接。

我也尝试使用ssh进行端口转发:

Vagrantfile

所有似乎都可以使用端口转发,但是当文件发生变化时,警卫再也不会做任何事情。

主持人和访客都是ubuntu 14.04。

我的config.vm.network 'forwarded_port', guest: 80, host: 3000 config.vm.network 'private_network', ip: '10.11.12.13' 中的网络配置如下:

{{1}}

使这项工作的正确方法是什么?

4 个答案:

答案 0 :(得分:5)

更新2:

Listen 3.x不再包含TCP功能(请参阅https://github.com/guard/listen/issues/258),因此您需要锁定到2.x,例如在Gemfile

gem 'listen', '~> 2.9'

然后按照以下说明操作:

更新1:

要使guard> = v2.7.0正常运行,您需要listen> = v2.9.0和魔术-r选项(因为完整路径不匹配主人和客人):

listen -r -f 10.11.12.1:4000 # on the host (note "-r" option)
guard -o 10.11.12.1:4000 # on the guest (paths relative, so no prob)

注意:

  • 由于guard v2.7.0,-w仅用于侦听多个目录。相反,请在您正在观看的目录中收听

  • 我只考虑Vargrant / ssh转发只有你在防火墙后面,或者由于某种原因你不能使用给定的端口 - 而是使用VM分配的IP和网络(例如10.11.12.1)

  • 用于调试guard中的内容,请查看:https://github.com/guard/guard/wiki/Understanding-Guard(值得一看)

  • 在127.0.0.1上运行侦听TCP服务器没有多大意义(除非您必须使用复杂的ssh端口转发设置)

答案 1 :(得分:1)

请参阅Cezary Baginski's answer以获得更简洁的答案,以及如何使用较新的(> = 2.7.0)版本的后卫。我将保留此答案上下文。


有了Cezary Baginski关于网络应该如何工作以及无法使这个设置工作的建议,我继续进行调查,假设必须有某些东西在Jamie Lawrence的实施/博客文章和现在之间打破了。

所以我决定将guardlisten降级到同一时间段(2014年2月24日)发布的版本。那给了我:

gem 'guard', '2.5.1'
gem 'listen', '2.6.1'

之后我遇到了一个错误,我通过将guard-rspec降级到同一时间段内的某个版本来解决问题:

gem 'guard-rspec', '4.2.8'

我仍然收到(不同的)错误,因此我使用guard init rspec重新生成了一个新的Guardfile。请注意,在此之前,后卫在主机上运行完全正常,并使用轮询或rsync处理guest虚拟机(虽然轮询/ rsync性能非常糟糕) - Guardfile不是问题。

那之后是真相的时刻:

listen -f 10.11.12.1:4000 # on the host
guard -o 10.11.12.1:4000 -w "/home/me/my_project" # on the guest

最后,我已经开始工作了。

然后我以二进制搜索方式浏览了从guard2.5.1的{​​{1}}版本,尝试确定某些内容可能已损坏。我发现这只是在2.12.4停止工作。

guard > 2.6.1

我认为这和现在一样好。 I have filed a bug with guard

答案 2 :(得分:1)

我也遇到了同样的问题,我解决了安装问题:https://github.com/mhallin/vagrant-notify-forwarder 这会自动将fs文件更改转发给vagrant vm

希望有所帮助

答案 3 :(得分:0)

我在MacOS上使用Vagrant来开发rails应用程序。我一直在使用NFS来同步我的Mac(主机)和Virtualbox Vm(来宾)的文件夹。在尝试使用Mac上的LISTEN gem将文件系统更改通知发送到虚拟机上的GUARD时,我遇到了许多问题。

对我来说,最好的解决方案是将Vagrant中的文件夹同步方法更改为" rsync"正如here所述。现在,因为文件实际上在VM上,所以最新版本的Guard工作正常,并且使用tcp在主机上没有复杂的文件系统更改传递给VM。

到目前为止,我所观察到的唯一问题是同步btwn mac和VM不是即时的,特别是如果(vagrant defined)同步文件夹很大的话。对我来说,延迟是可以接受的(1-2秒)。