在 Vagrant 上观察文件的变化,文件修改时间不更新

Watching files for changes on Vagrant, file modification times not updating

我们正在试用 Vagrant。我们在主机上有一个通过 NFS 与来宾共享的 Web 应用程序目录。在开发网站时,我们很快就遇到了问题。

我们正在 运行宁 gulp-watch 以发现对样式表和 javascript 文件以及 运行 任务的更改,但更改在一分钟内未被提取.

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

我最终将问题归结为一个非常短的 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(增加其全部内容,一个整数)然后刷新页面时,它会按预期工作(新文件修改日期和新文件内容)或文件内容会更新但文件修改日期不会。点击刷新后,修改日期就会赶上。这是后一种情况的示例。

后来我发现,如果把"modified"和"contents"行调换一下,在查看修改日期之前检索内容,我每次都会得到预期的输出。

问题是造成这种情况的原因以及我们如何解决它,它是否与监视文件更改的问题有关?

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

使用gulp-watch 运行ning,我们可以编辑来自主机的文件,而访客正在观看,而不会被注意到。但是一旦来宾访问文件(例如使用 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"]

更改现在会立即生效。