我们的Symfony2 web应用程序使用开发模式下的Assetic观察器在旅途中重新编译资产。
webapp运行在一个运行在Vagrant VM(Ubuntu 12.04 Precise)的Docker容器中。 主机是OSX 10.9 Mavericks,它通过NFS(v3)共享与VM共享代码文件夹,代码通过Docker中的主机/来宾卷安装在容器中。
由于inotify似乎无法通过NFSv3检测文件修改,因此观察者以非常缓慢的轮询模式(检测修改大约1/2分钟)工作。
我读过NFSv4是符合规范的,但是我没有发现任何好的资源。
有没有办法使NFS / inotify一起工作?
不幸的是,inotify 不能在NFS上工作。 inotify通过挂钩在内核的VFS(虚拟文件系统)层中工作。 每当修改发生,inotify就知道它,因为修改发生在同一台机器上,因此在同一个内核 – 这使得整个事情成为可能。
使用NFS时,服务器上会发生修改,并且客户端上可能会收到通知。 但是NFS在更改时不会通知客户端。 否则,它不会缩放。 NFS已被设计(并运行)在一台服务器上拥有数千个客户端。 想象一下,如果你做了一个微小的改变,服务器必须推送给所有的客户端!
当然,你可以说:“嘿,在NFS协议中应该有一个订阅机制,这样客户端可以告诉服务器他们想知道在特定位置发生的变化。 那么,NFS是30年前设计的,所以原谅他们不包括这个订阅/通知系统:-)
我对Assetic不熟悉,但也许可以使用自定义脚本来手动观察更改,并在每次检测到更改时重新编译资源。 只需遍历包含资源来源的目录,跟踪关联数组中每个文件的mtime,并且每次检测到新文件(或新的mtime)时,都要重新编译。 繁荣!
另请参阅有关inotify和NFS的其他SO问题 。
这是一个旨在解决这个问题的插件: https : //github.com/mhallin/vagrant-notify-forwarder
只需安装它并重新加载您的邮箱,以便将转发通知转发给您的客人机器:
vagrant plugin install vagrant-notify-forwarder
您可能会对这个名为Guard的工具感兴趣,它会监听在主机操作系统上进行的文件更改,然后在Guest上进行更新。 这对我有用,现在我的资产几乎是瞬间更新。
https://serverfault.com/questions/453826/vagrant-shared-folder-and-file-change-events