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

时间:2012-06-11 07:38:44

标签: node.js virtualbox vagrant gruntjs

我有以下设置:

  1. Vagrant创建的Ubuntu Lucid 32 VM。
  2. 使用某些CSS和JS文件启动Vagrant的文件夹。该文件夹安装在VM的地址/ vagrant /.
  3. 带有监视任务的
  4. grunt.js从VM启动,监视css和js文件的变化。更改文件后,必须将此文件连接到一个css和一个js文件。
  5. 问题:grunt.js中的监视任务没有看到已安装文件夹中的更改。

    如果我更改VM内的文件,请正常查看任务。 如果我不是从虚拟框启动grunt.js,而是从主操作系统启动它也可以。在Mac OS和Windows 7中尝试过。

    只有问题发生,然后从VM启动任务,并从主操作系统更改文件。这个问题有解决方法吗?

    更新。有关我们的使用方案的一些详细信息,以便更好地了解背景信息:

    1. 我们正在设计工作室,10+ peaple使用代码。
    2. 使用不同操作系统的不同人。我们有:Win 7,Mc OS X和Ubuntu Linux。
    3. 我们正在努力并支持100多个不同的项目。
    4. Prject正在使用不同的语言和设置:我们在自己的CMS上有PHP项目,在Yii上有PHP项目,在Django上有Python项目,还有一些node.js项目。
    5. 不同的开发人员可能会在某个时间点处理任何这些项目。
    6. 现在,每当我们需要在开发人员的计算机上进行项目工作时,我们会花费大量时间,而开发人员以前没有使用它。通常我们需要一些已经开发过它的开发人员的帮助。
    7. 我们想让它变得更加直截了当。为此,我们尝试使用Vagrant和一些预先配置的操作系统映像。

      现在项目设置如下:

      1. 来自git的开发人员结帐项目。
      2. 开发人员在终端中打开项目文件夹。
      3. 开发人员进入'流浪汉'。
      4. 5分钟后,他完全配置并正在处理项目副本。
      5. 我们喜欢这种设置,大部分时间我们都没有遇到任何问题。但是在我们的node.js项目中,我们使用了一些css和js预处理器,并且喜欢实时更新它们的文件。并且最初的帖子存在问题。

        使用ssh VM访问文件以及VM内部项目文件的解决方案可能会有效,但它们无法解决基本问题(在运行不同操作系统的开发人员组中快速轻松地设置大量项目)

3 个答案:

答案 0 :(得分:7)

文件/路径观察者依赖于操作系统的低级设施,如Linux上的inotify或BSD系统上的kqueue。这些机制直接与文件系统驱动程序一起工作,它们不会在网络安装上看到更改。如果您的脚本可以在虚拟操作系统上运行,那么您可能会改变共享的方向。而不是从客户操作系统内部访问主机操作系统上的共享文件夹,而是使用客户操作系统上的真实文件夹(实际操作发生的位置)并从主机操作系统访问它以编辑文件。通过这种方式,您的客户操作系统将像其在生产环境中一样工作,这是Vagrant所承诺的;但显然没有兑现。

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

在切换到Sublime作为我的主编之前,我已经使用Vim超过十年了。那时,我使用WinSCP作为SFTP客户端,而不是使用Vim的sftp / ssh设备,这些设备总是有问题。正确配置后,无论何时双击服务器上的文件,它都会在您选择的编辑器上打开它,每当您保存文件时,WinSCP会自动将其上传到服务器。这与Sublime的SFTP插件非常接近;但是,本地(主机操作系统)版本的文件是在WinSCP即时创建的临时文件夹上创建的。

Sublime的SFTP插件的方法,在两个系统上都有重复的文件夹符合我的需求,因为我还在主机操作系统上运行SpiderOak作为我的备份解决方案。我喜欢它,因为它保留了文件的版本历史。我将其设置为每小时检查一次更改,而不是经常观察以使其执行更平滑,以免在系统出现故障时丢失一小时的工作。一切都在这个设置中完美运行,我已经多次使用它的旧版本功能,这使我免于大量的苦差事和失去工作。

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

更新:特别是基于以下症状总结为“如果我更改VM内的文件,请观察任务正常工作。如果我从虚拟框启动grunt.js,但是从主操作系统启动它也可以工作“。在这个问题中,我对grunt.js如何监视文件和文件夹做了错误的假设。我以为它是使用node的fs。* watch函数;但正如pyfunc展示了一项做得好的研究,我的假设是错误的。虽然这不会影响我提出的任何建议的结果,但这是一个错误的技术信息我必须道歉。因此,看起来问题是由于在远程计算机上进行修改时未正确设置文件的修改时间导致可能使vbox对此类使用无用,这取决于文件的修改时间

答案 1 :(得分:2)

注意:我没有提供任何完整的解决方案而且我不是JavaScript程序员

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

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

进行文件的观察的部门。它使用fs.statSync(同步统计):

// 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”功能: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。您可以编写一个简单的js文件,利用node.js中的fs来检查更改共享文件夹中文件之前和之后的fs.statSync结果。

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

关于VirtualBox中共享文件夹的一点说明

使用它是为了方便,因为当VM启动时,vagrant会共享puppet配置文件并将其应用于VM。已知的问题是,随着共享文件夹中文件数量的增加,VirtualBox共享文件夹性能会迅速降低。

对于任何重负荷提升,请使用其他机制将文件存储在VM中的常规目录中。使用NFS共享文件夹。

答案 2 :(得分:0)

我在Windows 10主机上运行带有VirtualBox的CentOS 7 VM时遇到了同样的问题:browsersync无法检测到VBox Shared文件夹中的更改。 帮助我的是调整手表过程一点点。 Browsersync使用chokidar来监视文件。设置usePolling: true为我解决了问题。如何使这对你的案件有用?

  • 尝试找到使用chokidar的咕噜声。让观察者使用民意调查。
  • 调整观察者的设置。