【问题标题】:Guard --listen-on with vagrantGuard --listen-on with vagrant
【发布时间】:2015-04-29 13:36:57
【问题描述】:

我正在尝试将guard 的--listen-on 选项与here 概述的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 成功开始监听。但是当我在我的 vagrant guest 中运行 guard -o "10.0.2.2:4000" -w "/home/me/my_project/" 时,当文件更改时,guard 不会做任何事情。在listen 调用中添加-v 标志表明更改正在在主机上正确获取。

我还尝试了主机上的listen -f 10.11.12.1:4000 与来宾上的guard -o "10.11.12.1:4000" -w "/home/me/my_project/" 结合,结果相同,当文件更改时,Guard 不做任何事情。

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

一切似乎都可以进行端口转发,但是当文件更改时,Guard 再一次不会做任何事情。

主机和访客都是ubuntu 14.04。

Vagrantfile中的网络配置如下:

config.vm.network 'forwarded_port', guest: 80,   host: 3000
config.vm.network 'private_network', ip: '10.11.12.13'

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

【问题讨论】:

标签: ruby-on-rails rspec vagrant guard


【解决方案1】:

更新 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 端口转发设置)

【讨论】:

  • 感谢您抽出宝贵时间回复。根据您对网络应该如何工作的建议,我得出的结论是,这个用例在guard > 2.6.1 中被破坏了。我在 github 中提交了一个错误,我看到你是一个很大的贡献者,所以如果需要我们可以继续在那里讨论。再次感谢您的帮助。
  • 现在看来这已经被打破了,因为 listen 已经删除了 3.0.0 的 -f 标志
【解决方案2】:

请参阅 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。请注意,在此之前,guard 在主机上运行得非常好,并使用 polling 或 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.

【讨论】:

    【解决方案3】:

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

    希望对你有帮助

    【讨论】:

    • 谢谢!我一直在寻找这个已经有一段时间了。
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-09-10
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      • 2015-04-22
      • 2015-12-21
      • 1970-01-01
      • 2018-03-16
      相关资源
      最近更新 更多