在 VM 中运行的 node.js 脚本看不到主操作系统所做的文件夹更改

标签 node.js virtualbox vagrant gruntjs

我有以下设置:

  1. Vagrant 创建的 Ubuntu Lucid 32 虚拟机.
  2. Vagrant 启动的文件夹,其中包含一些 CSS 和 JS 文件。该文件夹安装在 VM 内的地址/vagrant/处。
  3. grunt.js监视任务从 VM 启动,监视 css 和 js 文件的变化。文件修改后,必须将这些文件拼接成一个css和一个js文件。

问题:grunt.js 中的监视任务没有看到挂载文件夹的变化。

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

只有在从 VM 启动任务并从主操作系统更改文件时才会出现问题。这个问题有解决办法吗?

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

  1. 我们正在设计工作室,有 10 多个人在使用代码。
  2. 不同的人使用不同的操作系统。我们有:Win 7、Mc OS X 和 Ubuntu Linux。
  3. 我们正在开发和支持 100 多个不同的项目。
  4. 项目使用不同的语言和设置:我们在自己的 CMS 上有 PHP 项目,在 Yii 上有 PHP 项目,在 Django 上有 Python 项目,还有一些 node.js 项目。
  5. 不同的开发人员可能会在某个时间点参与其中的任何项目。
  6. 现在,每次我们需要在开发人员的计算机上进行项目工作时,我们都会花费大量时间,而他们以前没有使用过它。通常我们需要一些已经在这方面工作的开发人员的帮助才能使其正常工作。

我们想让它更直截了当。为此,我们尝试使用 Vagrant 和一些预配置的操作系统镜像。

现在项目设置如下所示:

  1. 来自 git 的开发人员 checkout 项目。
  2. 开发者在终端中打开项目文件夹。
  3. 开发者进入 'vagrant up'。
  4. 5 分钟后,他已完全配置并可以工作的项目副本。

我们喜欢这种设置,而且大多数时候我们没有遇到任何问题。但是在我们的 node.js 项目中,我们使用了一些 css 和 js 预处理器,并且喜欢实时更新它们的文件。并且在最初的帖子中存在问题。

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

最佳答案

文件/路径观察器依赖于操作系统的底层设施,例如 Linux 上的 inotify 或 BSD 系统上的 kqueue。这些机制直接与文件系统驱动程序一起工作,它们不会看到网络挂载的变化。如果您的脚本可以在虚拟操作系统上运行,那么您可能会改变共享的方向。不要从 guest 操作系统内部访问主机操作系统上的共享文件夹,而是使用 guest 操作系统上的真实文件夹(实际操作发生的地方)并从主机操作系统访问它来编辑您的文件。这样,您的客户操作系统将像在其生产环境中一样工作,这是 Vagrant 所 promise 的;但显然无法交付。

我个人使用带有 SFTP 插件的 Sublime Text 2 编辑器。在此设置中,我保留了两个文件副本并在主机操作系统上处理这些文件。每当我编辑/添加文件时,我的编辑器都会快速将其上传到服务器,即 guest 操作系统。当我迁移到生产服务器时,我仍然可以使用比使用共享文件夹更好的方法。

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

Sublime 的 SFTP 插件采用的方法是,在两个系统上都有文件夹副本更适合我的需求,因为我还在主机操作系统上运行了 SpiderOak 作为我的备份解决方案。我喜欢它,因为它保留了文件的版本历史。我将其设置为每小时检查一次更改,而不是不断观察以使其执行更顺畅,如果系统发生故障,可能会失去一个小时的工作。在此设置中一切正常,我确实多次使用它的旧版本功能,这让我免于大量的苦差事和工作损失。

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

更新:特别基于症状总结为“如果我在虚拟机中更改文件,观察任务正常工作。如果我不是从虚拟机启动 grunt.js,而是从主操作系统它也可以工作。”在这个问题中,我对 grunt.js 如何监视文件和文件夹做出了错误的假设。我以为它是在使用 Node 的 fs.*watch 函数;但正如 pyfunc 通过一项出色的研究表明的那样,我的假设是错误的。虽然这不会影响我提出的任何建议的结果,但我必须为这是一个错误的技术信息道歉。因此,看起来问题是由于在远程机器上进行修改时未正确设置文件的修改时间引起的.

关于在 VM 中运行的 node.js 脚本看不到主操作系统所做的文件夹更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10976104/

相关文章:

node.js - 混淆 SSL 与 Node 和使用 cURL

ruby-on-rails - Vagrant/VirtualBox VM 配置 : rbenv installs successfully but subsequent uses in script fail

ruby - Vagrant 构建 Gem 原生扩展失败

node.js - token 无效或提供的状态 token 无效

node.js - Graphdb.js Node.js - 使用 GraphDB 进行 Node 服务器身份验证

node.js - 由于 MissingSchemaError,Mongoose .populate() 未填充

MySQL:错误 2003 与同一本地网络上的虚拟机失去连接

virtualbox - VirtualBox VBoxManage 可以即时添加/删除共享文件夹吗?

vagrant.d 在主文件夹之外