守卫——与流浪汉一起听

Guard --listen-on with vagrant

我正在尝试按照概述 here 将 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.

如果我尝试开始 listen 然后 然后 开始 vagrant,vagrant 会类似地抱怨:

Vagrant cannot forward the specified ports on this VM, since they would collide with some other application that is already listening on these ports. The forwarded port to 4000 is already in use on the host machine.

所以我尝试了一些其他的东西,同时在 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/",结果相同,当文件更改时,守卫不做任何事情。

listen -f 127.0.0.1:4000guard -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

一切似乎 都可以通过端口转发进行,但是当文件被更改时守卫也不会做任何事情。

主客都是ubuntu14.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 不再包含 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)

备注:

  • guardv2.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 端口转发设置)

请参阅 以获得更简洁的答案以及如何使它与更新的 (>= 2.7.0) 版本的 guard 一起工作。 我要离开了此答案符合上下文。


根据 Cezary Baginski 关于网络应该如何工作的建议,仍然无法让这个设置工作,我开始调查进一步假设 Jamie Lawrence 的实施/博客 post 和现在之间一定有问题。

所以我决定将 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。请注意,在此之前,guard 运行 在主机上运行良好,在客户机上通过轮询或 rsync 工作(尽管 polling/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.12.12.4guard 版本,以尝试确定可能出现问题的地方。我发现这只是在 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'

我认为这是目前最好的。 I have filed a bug with guard.

我在 MacOS 上使用 Vag运行t 来开发 rails 应用程序。我一直在使用 NFS 来同步文件夹 btwn 我的 Mac(host) 和 Virtualbox Vm(guest)。我 运行 在尝试使用我的 Mac 上的 LISTEN gem 将文件系统更改通知发送到虚拟 [=23] 上的 GUARD 时遇到 许多 问题=]hine.

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

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

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

希望对您有所帮助