在VM共享目录上运行`grunt`

时间:2014-04-18 17:27:10

标签: javascript windows gruntjs vagrant

将Vagrant与Windows主机和Linux guest虚拟机一起使用时,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'

我可以在访客VM上的非共享目录上开发,但我更喜欢使用共享目录,因为我在主机上使用IDE。

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

3 个答案:

答案 0 :(得分:5)

我在使用角度发生器运行自耕农时遇到了类似的问题。我现在找到的解决方案是一个小技巧,利用npm处理它的依赖关系和folder structure的方式。

请注意您遇到的问题可能只会影响一些文件(可能只影响imagemin模块)。

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

yo angular appname --skip-install

手动启动凉亭安装:

bower install

从这里开始,你应该感兴趣:安装“request”npm模块作为第一级模块(而不是以后在imagemin中深度解析的依赖关系):

npm install request --save-dev

因此,如果您现在运行常规npm安装来获取剩余的模块,则使用现有的请求模块。

npm install --no-bin-links

请注意,如果您不想运行VirtualBox as an Administrator,使用--no-bin-links也是一个好主意。

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

答案 1 :(得分:4)

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

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

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

rsync synced文件夹基本上使用rsync CLI实用程序在主机之间复制/同步文件和目录。所以一切都有2份。对guest虚拟机中的文件系统运行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问题。

答案 2 :(得分:2)

要获得实际解决方案,请查看this comment,或继续阅读:

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)。详细了解max path。这是在共享文件夹创建过程中发生的,这是由VBoxManage有意处理的,而不是Vagrant" synced_folder"方法。最后一点是不言自明的;我们创建新的共享文件夹,然后确保每次访问或触摸机器时都安装它,因为Vagrant喜欢在每次加载时重新加载其安装/共享文件夹。

我希望这有帮助!