在VM共享目录上运行“grunt”
Running `grunt` on VM Shared Directory
在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
类型将监视主机和来宾之间的文件夹,复制文件目录以保持它们的同步。
默认vboxsf
和rsync
之间的区别在于,后者将导致来宾Linux从其本机文件系统(例如ext4
)而不是vboxsf
(在所有文件都在Windows上之后,由VirtualBox guest Additions提供)运行应用程序(在您的情况下是咕哝)。
rsync
同步文件夹基本上使用rsync
CLI实用程序在主机之间复制/同步文件和目录。所以所有东西都有两份。当您针对来宾中的文件系统运行grunt
时,它是本机Linux文件系统,不应受到长路径的影响(但ext4的文件名最大长度为255字节)。
默认情况下,Vagrant只同步vagrant up
或vagrant 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喜欢在每次加载时重新加载它的挂载/共享文件夹。
我希望这能有所帮助!
- 检查grunt是否在详细模式下运行
- 运行 grunt.file.copy 返回错误代码:ENOENT
- Node.js/Grunt - 无法运行 Grunt 的手表 - 为什么
- 在另一个任务之前异步运行 grunt 任务
- 如何在我的 Yeoman 生成器完成安装后运行 Grunt 任务
- 在不阻塞终端的情况下运行Grunt Watch
- 运行grunt contrib imagemin时出错
- 当运行grunt时,我得到SyntaxError:意外的令牌(
- 仅对最近修改的文件运行grunt contrib jshint
- 直接从节点运行Grunt任务
- Angular主存储库运行grunt测试失败;的任务
- 运行Grunt Express Server导致错误:enent: no such file or directory,
- 在Windows上运行Grunt时出错:致命错误:无法找到本地Grunt
- 使用QUnit运行Grunt时出现JSHint错误
- 运行Grunt任务返回错误
- 当我运行Grunt时,我得到警告说'default'未找到任务
- 运行“Grunt服务”时出错.使用generator-angular-fullstack种子
- 在VM共享目录上运行“grunt”
- QUnit测试在Travis CI上失败(在phantomjs上运行grunt.js)
- 运行grunt只是打开一个记事本文件,而不是实际运行任务