在VM中运行的node.js脚本不会看到主OS所做的文件夹更改

我有以下设置:

  1. 由Vagrant创build的Ubuntu Lucid 32 VM。
  2. Vagrant是用一些CSS和JS文件启动的文件夹。 该文件夹被安装在地址为/ vagrant /的虚拟机内部。
  3. grunt.js带有从VM开始的监视任务,监视css和js文件的变化。 文件更改后,必须将这些文件连接到一个css和一个js文件。

问题:grunt.js中的监视任务没有看到安装文件夹中的更改。

如果我改变虚拟机内的文件,看任务正常工作。 如果我不是从虚拟框启动grunt.js,而是从主要的os启动它也可以。 尝试在Mac OS和Windows 7。

问题只发生在任务从VM开始,文件从主OS改变。 有没有解决这个问题的方法?

更新。 关于我们的使用场景的一些细节,以更好地理解上下文

  1. 我们正在devise工作室,10+人使用代码。
  2. 不同的人使用不同的OS。 我们有:Win 7,Mc OS X和Ubuntu Linux。
  3. 我们正在致力于支持100多个不同的项目。
  4. 主题使用不同的语言和设置:我们有我们自己的CMS上的PHP项目,Yii上的PHP项目,Django上的Python项目和一些node.js项目。
  5. 不同的开发者可能在某个时间点工作在这个项目上。
  6. 现在我们每次需要花费大量的时间在开发人员的计算机上进行项目工作,而之前没有使用过这个工具。 而且通常我们需要一些已经开始工作的开发人员的帮助。

我们想让它变得更加直接。 为此,我们尝试使用Vagrant和一些预configuration的操作系统映像。

现在项目设置看起来像这样:

  1. 从git开发人员签出项目。
  2. 开发者在terminal打开项目文件夹。
  3. 开发者进入“stream浪”。
  4. 5分钟后,他完全configuration和工作的项目副本。

我们喜欢这个设置,大部分时间我们没有任何问题。 但在我们的node.js项目中,我们使用了一些css和js预处理器,并且喜欢实时更新它们的文件。 最初的post有问题。

可以使用ssh虚拟机访问文件的解决scheme以及虚拟机内部的项目文件的解决scheme可能会起作用,但是它们并没有解决基本问题(在运行不同操作系统的开发人员组中大量项目的快速和轻松设置)

文件/path监视器依赖于操作系统的低级设施,如Linux上的inotify或BSD系统上的kqueue。 这些机制直接与文件系统驱动程序一起工作,他们不会看到networking挂载的变化。 如果您的脚本将在虚拟操作系统上运行,那么您可能会改变共享的方向。 而不是从客户操作系统内部到达主机操作系统上的共享文件夹,而是在客户操作系统上(实际操作发生的地方)使用真实文件夹,并从主机操作系统访问它来编辑文件。 这样,您的客户操作系统将会像在生产环境中那样工作,这是Vagrant所承诺的; 但显然没有交付。

我个人使用SFTP插件Sublime Text 2编辑器。 在这个设置中,我保留了两个文件副本,并在主机操作系统上运行。 每当我编辑/添加一个文件,我的编辑器很快将其上传到服务器,即客户操作系统。 当我转移到生产服务器时,我仍然可以使用与使用共享文件夹相同的方法。

在作为我的主编切换到Sublime之前,我已经使用了Vim十多年了。 那时候,我没有使用Vim的sftp / ssh工具,而是使用WinSCP作为SFTP客户端。 正确configuration后,只要双击服务器上的某个文件,就会在您select的编辑器上打开它,每当您保存文件时,WinSCP都会自动将其上传到服务器。 这与我使用Sublime的SFTP插件非常接近。 但是本地(主机操作系统)版本的文件是在WinSCP即时创build的临时文件夹上创build的。

Sublime的SFTP插件有这样的方法,在两个系统上都有重复的文件夹,这更符合我的需求,因为我还将SpiderOak作为我的备份解决scheme在主机操作系统上运行。 我喜欢它,因为它保持文件的版本历史。 我把它设置为每小时检查一次,而不是经常观察,以防止在系统故障的情况下丢失一小时的工作,从而使其更顺畅。 在这个设置中一切都很完美,而且我已经使用了它的旧版本function,这使我从很多苦差事和失去的工作中解脱出来。

所以,总而言之,如果您想继续使用共享文件夹,您将要做的是在来宾操作系统(您的Ubuntu)上安装和configurationSamba / NFS / FTP服务器并共享这些文件夹。 然后,您将访问从主机操作系统(您的Mac / Win7)的networking共享访问任何其他共享的远程文件夹相同的方式。 如果您的使用和需求与我的相似,那么我强烈build议您使用Sublime + SFTP或YourEditor和WinSCP或类似的SFTP客户端。

更新:特别是症状总结为“如果我改变VM内的文件,看任务正常工作,如果我启动grunt.js不是从虚拟框,但从主要操作系统也起作用。 在这个问题中,我对grunt.js如何观察文件和文件夹做了一个错误的假设。 我认为这是使用节点的FS *手表function; 但是pyfunc的研究做得很好,我的假设是错误的。 虽然这并不影响我提出的任何build议的结果,但这是一个我不得不道歉的错误的技术信息。 所以,看起来问题是由于在远程机器上修改文件时,文件的修改时间没有正确设置,导致vboxfs对于这种依靠文件修改时间的使用而无用的问题。

注:我没有提出任何完整的解决scheme,我不是JavaScript程序员

grunt.js关于观看文件的问题

来源: https : //github.com/cowboy/grunt/blob/master/tasks/watch.js

它执行文件的观看部分。 它使用fs.statSync(Synchronous stat):

// Get last modified time of file. mtime = +fs.statSync(filepath).mtime; // If same as stored mtime, the file hasn't changed. if (mtime === mtimes[filepath]) { return; } // Otherwise it has, store mtime for later use. mtimes[filepath] = mtime; } 

它使用node.js中的“fs”function: http : //nodejs.org/api/fs.html#fs_class_fs_stats

在文件中的各种数据中,它返回以下时间属性:

 atime: Mon, 10 Oct 2011 23:24:11 GMT, mtime: Mon, 10 Oct 2011 23:24:11 GMT, ctime: Mon, 10 Oct 2011 23:24:11 GMT 

所以结论是它使用stat。 您可以使用node.js中的fs编写一个简单的js文件,以检查在共享文件夹中更改文件之前和之后的fs.statSync结果。

这将确定您是否应该使用grunt.js的watcher实用程序监视文件。

关于VirtualBox中的共享文件夹的一点注意

使用它是为了方便,因为一旦虚拟机启动,stream浪者会共享puppetconfiguration文件并将其应用到VM上。 VirtualBox共享文件夹的性能随着共享文件夹中文件数量的增加而迅速下降,这是已知的问题。

对于任何繁重的工作,使用其他机制将文件存储在虚拟机的常规目录中。 使用NFS共享文件夹。

我在Windows 10主机上运行带有VirtualBox的CentOS 7虚拟机时遇到了同样的问题:浏览器同步无法检测到VBox共享文件夹中的更改。 什么帮助我调整了一下观察过程。 Browsersync使用chokidar来监视文件。 设置usePolling: true解决了我的问题。 如何使这对你的情况有用?

  • 尝试find使用chokidar的咕噜咕噜声。 获取观察者使用轮询。
  • 调整观察者的设置。