使用 vagrant 时,Figwheel 不热重载或更新文件保存

Figwheel not hot reloading or updating on file save when using vagrant

当 运行 figwheel 从 vagrant box 出来时,似乎没有注意到文件更改,因此 figwheel 没有 update/reload 页面。

在花费数小时试图弄清楚发生了什么之后,最终归结为 figwheel 如何检测文件更改。

使用 hawk library which in turn uses the operating system to that tell hawk the file has updated. Because vagrant defaults to using vboxsf there is no underlying update mechanism to provide updates that the file has changed, see here 来检测文件更改。要解决这个问题,我们只需要告诉 figwheel 和 hawk 轮询文件更改:

:figwheel {:hawk-options {:watcher :polling}

只需将它弹出到您的 profile.clj 中,这将允许 figwheel 在文件保存后看到更改,尽管轮询需要一段时间才能获取更改,所以稍等一下.

但这只解决了一半的问题,因为 figwheel 仍然需要一个活动的 websocket 连接来实际推送代码更改。由于 vagrant 虚拟机是网络上的独立机器并且需要您将此 websocket 公开给不仅仅是本地主机这一事实,所以这很复杂。这可以通过在 project.clj 中的 figwheel 映射中添加另一个键来实现:

:figwheel {:server-ip "0.0.0.0"}

然后在 vagrantfile 中公开 figwheel websocket 端口:

config.vm.network "forwarded_port", guest: 3449, host: 3449

这应该可以修复 vagrant 上的 figwheel!

仅供参考,我遇到了类似的问题,正在研究以下解决方案

troubleshooting on vagrant docker

引用

Watch Task not working in Docker / Vagrant?

Scenario: Changes made to a file mounted with Docker / Vagrant between the guest and host os via NFS; filesystem events are not received correctly.

Resolution: Use rsync in these environments, as NFS does not support inotify. You may also wish to run a repl server in the guest os and connect to it from the host.