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

Kev*_*ith 8 javascript windows vagrant gruntjs

将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'
Run Code Online (Sandbox Code Playgroud)

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

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

Tar*_*haf 5

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

请考虑您遇到的问题可能只影响一些文件(可能只影响imagemin模块).

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

yo angular appname --skip-install
Run Code Online (Sandbox Code Playgroud)

手动启动凉亭安装:

bower install
Run Code Online (Sandbox Code Playgroud)

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

npm install request --save-dev
Run Code Online (Sandbox Code Playgroud)

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

npm install --no-bin-links
Run Code Online (Sandbox Code Playgroud)

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

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

  • 很高兴它适用于其他用例!不幸的是,我既没有得到设置赏金(投票平等),也没有得到这个答案.好吧,发生了. (2认同)

Ter*_*ang 4

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

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

vboxsfdefault和default 之间的区别在于,后者将导致来宾 Linux 从其本机文件系统(例如,由 VirtualBox Guest Additions 提供,所有文件都位于 Windows 上之后)rsync运行应用程序(在您的情况下为 grunt )。ext4vboxsf

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

vagrant up默认情况下,Vagrant 仅同步或上的文件夹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
Run Code Online (Sandbox Code Playgroud)

更新

测试创建目录树结构和文件,从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
Run Code Online (Sandbox Code Playgroud)

更新-rsync同步文件夹测试

我之前在物理 Linux 安装上进行了测试。下面在Mac上进行快速测试,guest同上。

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 
Run Code Online (Sandbox Code Playgroud)

注意:我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
Run Code Online (Sandbox Code Playgroud)

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