在Vagrant上查看文件以进行更改,文件修改时间不会更新

时间:2015-02-17 21:21:30

标签: laravel vagrant nfs grunt-contrib-watch gulp-watch

我们正在尝试Vagrant。我们在主机上通过NFS与guest虚拟机共享一个Web应用程序目录。在开发网站时,我们很快就开始遇到问题。

我们正在运行gulp-watch来发现对样式表和javascript文件的更改并运行任务,但是最多只能在一分钟内获取更改。

此外,Laravel没有注意到刀片模板正在被更改,因此没有重新编译它们并且显示旧的视图模板。

我最终将问题归结为一个非常简短的PHP脚本来演示错误。

<?php
header('Content-Type: text/plain');
$file = 'test.html';

echo "modified: " . date('r', filemtime($file)) . "\n";
echo "contents: " . file_get_contents($file) . "\n";

这将获取另一个文件test.html的修改时间并输出其内容。这给了奇怪的行为。当通过主机更改test.html(递增其全部内容,单个整数)然后刷新页面时,它将按预期工作(新文件修改日期和新文件内容)或文件内容会更新,但文件修改日期不会。在点击刷新时,修改日期将赶上。这是后一种情况的一个例子。

Demonstration

我后来发现,如果&#34;修改了&#34;和&#34;内容&#34;切换线以便在查看修改日期之前检索内容,我每次都会得到预期的输出。

问题是导致这种情况的原因以及我们如何解决这个问题,是否与观察文件变更的问题有关?

1 个答案:

答案 0 :(得分:6)

他们确实有联系。它似乎与NFS缓存文件的详细信息有关。

在gulp-watch运行的情况下,我们可以编辑主机正在观看的文件,并且不会被注意到。但是,只要访客访问该文件(例如使用cat file.less),gulp-watch进程就会看到更新的修改日期并运行其任务。

最终的解决方案是让Vagrant提示使用lookupcache=none选项挂载NFS共享。

为此,Vagrantfile中的一行已从

更改
config.vm.synced_folder "./", "/vagrant", type: "nfs"

config.vm.synced_folder "./", "/vagrant", type: "nfs", mount_options: ["lookupcache=none"]

现在立即收到更改。