在VM共享目录上运行“grunt”

Running `grunt` on VM Shared Directory

本文关键字:运行 grunt VM 共享      更新时间:2023-09-26

在Windows主机和Linux来宾上使用Vagrant时,grunt在尝试运行作业时返回以下错误。

据我所知,在主机-来宾共享目录中,此文件路径超过了Windows的255个字符限制。

npm ERR! Error: EPERM, open '/u01/aa/bb/build/share/app-core/app-
ui/node_modules/grunt-contrib-imagemin/node_modules/pngquant-bin/node_modules/bin-
wrapper/node_modules/download/node_modules/request/node_modules/form-
data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-
and-strings.js'

我可以在来宾虚拟机上的非共享目录上进行开发,但我更喜欢使用共享目录,因为我在主机上使用IDE。

如何解决此问题,以便在共享目录上运行grunt

我在使用角度生成器运行yeoman时遇到了类似的问题。我现在找到的解决方案是利用npm处理其依赖项和文件夹结构的方式的一个小技巧。

请考虑您遇到的问题可能只影响少数文件(可能只影响imagemin模块)。

对于Yeoman,我的解决方案是首先生成,跳过自动启动的安装:

yo angular appname --skip-install

手动启动船首安装:

bower install

从这里开始,你应该很感兴趣:将"请求"npm模块安装为一级模块(而不是稍后在imagemin中深入解决的依赖性):

npm install request --save-dev

因此,如果您现在运行常规的npm安装来获取剩余的模块,那么将使用已经存在的请求模块。

npm install --no-bin-links

请注意,如果您不想以管理员身份运行VirtualBox,那么使用--no-bin-links也是一个好主意。

所以,回答你的问题。如果您正确设置了软件包并在之前调用npm install,那么运行grunt应该可以工作。模块"请求"是一个任意模块,用于阻止test-delayed-streams-and-buffers-and-strings.js文件的大路径。

如果您使用默认的vboxsf同步文件夹类型,您可以考虑使用新的基于rsync的同步文件夹来解决此问题。

rsync类型将监视主机和来宾之间的文件夹,复制文件目录以保持它们的同步。

默认vboxsfrsync之间的区别在于,后者将导致来宾Linux从其本机文件系统(例如ext4)而不是vboxsf(在所有文件都在Windows上之后,由VirtualBox guest Additions提供)运行应用程序(在您的情况下是咕哝)。

rsync同步文件夹基本上使用rsync CLI实用程序在主机之间复制/同步文件和目录。所以所有东西都有两份。当您针对来宾中的文件系统运行grunt时,它是本机Linux文件系统,不应受到长路径的影响(但ext4的文件名最大长度为255字节)。

默认情况下,Vagrant只同步vagrant upvagrant reload上的文件夹。但您可以运行vagrant rsync手动强制同步,或者运行vagrant rsync-auto实时监控更改和同步。

参考:http://docs.vagrantup.com/v2/synced-folders/rsync.html

您可以在下方的Vagrantfile中将同步文件夹类型设置为rsync

Vagrant.configure("2") do |config|
  config.vm.synced_folder ".", "/vagrant", type: "rsync",
    rsync__exclude: ".git/"
end

更新

测试了创建目录树结构和文件,从Linux的角度打开它没有问题,文件系统是ext4。我怀疑这是npm的问题。

terry@arch:/$ uname -a
Linux arch.apac.lab 3.14.1-1-ARCH #1 SMP PREEMPT Mon Apr 14 20:40:47 CEST 2014 x86_64 GNU/Linux
terry@arch:/$ cat /u01/aa/bb/build/share/app-core/app-ui/node_modules/grunt-contrib-imagemin/node_modules/pngquant-bin/node_modules/bin-wrapper/node_modules/download/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-strings.js
test

更新-rsync同步文件夹测试

我之前在一个物理Linux安装上进行了测试。以下是在Mac上进行的快速测试,来宾与上面相同。

rsync同步文件夹配置

config.vm.synced_folder ".", "/u01/aa/bb/build/share/app-core/app-ui/           node_modules/grunt-contrib-imagemin/node_modules/pngquant-bin/node_modules/bin-   wrapper/node_modules/download/node_modules/request/node_modules/form-data/        node_modules/combined-stream/test/integration", type: "rsync 

注意:我提前递归chown -R vagrant:vagrant /u01/,以避免同步时出现权限问题。

vagrant up上同步

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Rsyncing folder: /ops/arch64/ => /u01/aa/bb/build/share/app-core/app-ui/node_modules/grunt-contrib-imagemin/node_modules/pngquant-bin/node_modules/bin-wrapper/node_modules/download/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration
==> default: Mounting shared folders...
    default: /vagrant => /ops/arch64
==> default: VM already provisioned. Run `vagrant provision` or use `--provision` to force it
$ vagrant ssh
Last login: Sun Apr 27 10:36:10 2014 from 10.0.2.2
vagrant@archlinux:~$ cd /u01/aa/bb/build/share/app-core/app-ui/node_modules/grunt-contrib-imagemin/node_modules/pngquant-bin/node_modules/bin-wrapper/node_modules/download/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration
vagrant@archlinux:/u01/aa/bb/build/share/app-core/app-ui/node_modules/grunt-contrib-imagemin/node_modules/pngquant-bin/node_modules/bin-wrapper/node_modules/download/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration$ ls -l
total 12
-rw-r----- 1 vagrant vagrant   14 Apr 27 10:35 test-delayed-streams-and-buffers-and-strings.js
-rw-r----- 1 vagrant vagrant 5018 Apr 27 10:22 Vagrantfile
vagrant@archlinux:/u01/aa/bb/build/share/app-core/app-ui/node_modules/grunt-contrib-imagemin/node_modules/pngquant-bin/node_modules/bin-wrapper/node_modules/download/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration$ cat test-delayed-streams-and-buffers-and-strings.js
stackoverflow

结果是一样的。如前所述,我怀疑这可能是一个npm问题。

有关此问题的实际解决方案,请查看此注释,或继续阅读此处:

config.vm.provider "virtualbox" do |v|
    v.customize ["sharedfolder", "add", :id, "--name", "www", "--hostpath", (("//?/" + File.dirname(__FILE__) + "/www").gsub("/","''"))]
end
config.vm.provision :shell, inline: "mkdir /home/vagrant/www"
config.vm.provision :shell, inline: "mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` www /home/vagrant/www", run: "always"

在上面的代码中,我添加了''''?''到当前目录的绝对路径。这实际上会迫使Windows API允许增加MAX_PATH变量(通常上限为260)。阅读有关最大路径的更多信息。这是在创建共享文件夹的过程中发生的,它是由VBoxManage有意处理的,而不是Vagrant的"synced_folder"方法。最后一点非常不言自明;我们创建了新的共享文件夹,然后确保每次访问或触摸机器时都会挂载它,因为Vagrant喜欢在每次加载时重新加载它的挂载/共享文件夹。

我希望这能有所帮助!