16

我有以下设置:

  1. 由Vagrant创建的 Ubuntu Lucid 32 VM 。
  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 和一些预配置的 OS 映像。

现在项目设置如下所示:

  1. 来自 git 的开发人员结帐项目。
  2. 开发人员在终端中打开项目文件夹。
  3. 开发人员输入“vagrant up”。
  4. 5 分钟后,他已完全配置并工作项目副本。

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

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

4

3 回答 3

7

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

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

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

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

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

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

于 2012-06-29T04:46:54.910 回答
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 中共享文件夹的一点说明

使用它是为了方便,就像 vagrant 共享 puppet 配置文件并在 VM 启动后将其应用到 VM 上一样。众所周知,VirtualBox 共享文件夹的性能会随着共享文件夹中文件数量的增加而迅速下降。

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

于 2012-06-29T05:31:30.840 回答
0

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

  • 尝试找到一个也使用chokidar的 grunt 插件。让观察者使用轮询。
  • 调整观察者的设置。
于 2017-09-04T03:01:24.290 回答