警卫 – 与流浪汉保持一致
我正在尝试使用guard的--listen-on
选项与vagrant,如此处所述,但我无法让它工作。
如果我将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/"
时,当文件发生变化时,警卫不会做任何事情。 向listen
调用添加-v
标志表明正在主机上正确地拾取更改。
我也尝试在主持人上listen -f 10.11.12.1:4000
与guard -o "10.11.12.1:4000" -w "/home/me/my_project/"
在客人guard -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/"
导致后卫无法连接。
我也尝试使用ssh进行端口转发:
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
一切似乎都适合端口转发,但是当文件发生变化时,警卫再也不会做任何事情。
主机和客户都是ubuntu 14.04。
我的Vagrantfile
的网络配置如下:
config.vm.network 'forwarded_port', guest: 80, host: 3000 config.vm.network 'private_network', ip: '10.11.12.13'
使这项工作的正确方法是什么?
更新2:
Listen 3.x不再包含TCPfunction(请参阅https://github.com/guard/listen/issues/258 ),因此您需要锁定到2.x,例如在您的Gemfile
:
gem 'listen', '~> 2.9'
然后按照以下说明操作:
更新1:
要使guard
> = v2.7.0正常工作,您需要listen
> = v2.9.0和magic -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端口转发设置)
请参阅Cezary Baginski的答案,以获得更简洁的答案以及如何使用更新(> = 2.7.0)版本的后卫。 我将把这个答案留给上下文。
有了Cezary Baginski关于网络应该如何工作以及仍然无法使这种设置工作的建议,我继续进行调查,假设Jamie Lawrence的实施/博客文章和现在之间必然存在某些问题。
所以我决定降级guard
并listen
在同一时间段(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
最后 ,我得到了这个工作。
然后我以二进制搜索方式浏览了从2.5.1
到2.12.4
的guard
版本,尝试确定哪些内容可能已损坏。 我发现这只是停止工作在guard > 2.6.1
。
# works gem 'guard', '2.6.1' gem 'listen', '2.8.6' gem 'guard-rspec', '4.2.8' # does not work gem 'guard', '2.7.0' gem 'listen', '2.8.6' gem 'guard-rspec', '4.2.8'
我认为这和现在一样好。 我已经向警卫提出了一个错误 。
我也有同样的问题,我解决了安装问题: https : //github.com/mhallin/vagrant-notify-forwarder哪个自动将fs文件更改转发给vagrant vm
希望能帮助到你
我在MacOS上使用Vagrant来开发rails应用程序。 我一直在使用NFS来同步我的Mac(主机)和Virtualbox Vm(来宾)的文件夹。 尝试在Mac上使用LISTEN gem将文件系统更改通知发送到虚拟机上的GUARD时,我遇到了很多问题。
对我来说,最好的解决方案是将Vagrant中的文件夹同步方法更改为“rsync”,如此处所述。 现在,因为文件实际上在VM上,所以最新版本的Guard工作正常,并且使用tcp在主机上没有复杂的文件系统更改传递给VM。
到目前为止我唯一看到的问题是同步btwn mac和VM不是即时的,特别是如果(vagrant defined)synced文件夹很大的话。 对我来说,延迟是可以接受的(1-2秒)。