Vagrant共享文件夹和文件更改事件

Vagrant共享文件夹和文件更改事件

我有一台通过 Vagrant 访问的 ubuntu 虚拟机。在我的主机 (Mac OSX) 上,有一个包含几个文件的文件夹,我将其共享给虚拟机。在该虚拟机中,我想使用警卫监视文件的变化,一旦任何文件发生变化,就执行一些操作。

我正确设置了防护装置,当从虚拟机内部更改共享文件时,它工作正常并运行适当的脚本。但是,如果我尝试从主机更改共享文件,则此文件更改事件不会传播,防护装置也不会做出反应。

这就是我的 vagrant 共享文件夹的样子(很常见)

local_config.vm.share_folder "app", "/var/www/app/current", "../app"

我甚至尝试使用 NFS 共享(:nfs => true)但没有帮助。

有什么方法可以让文件更改事件从主机传播到虚拟机吗?或者这是 Vagrant/VirtualBox 的本质吗?

更新:

经过多次尝试后,我安装了ZenTestgem,它包含自动测试工具,允许实现与文件改变事件相关的类似功能。

当在虚拟机中运行自动测试并从我的主机更改文件时,这些更改会被传播,并且自动测试反应

基于此,似乎文件更改事件传播是守卫的问题,而不是流浪者或虚拟盒的问题。

不过,我还没有研究过 guard 和 autotest 之间的实现差异。

现在我知道可以在虚拟机中捕获来自主机的文件更改事件。有人知道如何使用 guard 来实现这一点吗?我更喜欢 guard,因为它的 DSL 和通用可用性。

答案1

根本原因是 VirtualBox 不会将主机上的文件更改事件级联到虚拟机。Guard(在 Linux 上)希望通过 inotify 事件接收通知。相反,您可以让 guard 使用 轮询事件guard -p,但这可能会导致您的 CPU 达到最大限度,因此您可以使用 来降低轮询速度guard -p -l 10

guard help start

  -l, [--latency=Overwrite Listen's default latency]
  -p, [--force-polling=Force usage of the Listen polling listener]

http://www.softr.li/blog/2012/07/21/running-guard-over-vagrant

答案2

我知道这是一个老问题,但这里有一个更新的答案:

保护-o/--listen-on选项文档

粘贴在此处以供快速参考:

-o/--listen-on option

Use Listen's network functionality to receive file change events from the
network. This is most useful for virtual machines (e.g. Vagrant) which have
problems firing native filesystem events on the guest OS.

Suggested use:

On the host OS, you need to listen to filesystem events and forward them to
your VM using the listen script:

    $ listen -f 127.0.0.1:4000

Remember to configure your VM to forward the appropriate ports, e.g.
in Vagrantfile:

    config.vm.network :forwarded_port, guest: 4000, host: 4000

Then, on your guest OS, listen to the network events but ensure you
specify the host path:

    $ bundle exec guard -o '10.0.2.2:4000' -w '/projects/myproject'

答案3

如果有人遇到这个问题并且防护仍然不起作用......

我最终使用了观察者。它是 guard 的替代方案。在 watchr 中,从主机到客户机的事件传播可以正常工作。它也比 autotest 更灵活。

答案4

如果您在 Vagrant 中遇到此问题hugo,您可以使用轮询选项启动服务器:

hugo server --poll 2s

文档

--poll string            set this to a poll interval, e.g --poll 700ms, to use a 
                         poll based approach to watch for file system changes

相关内容