在Windows共享上安装软件包时出现Npm错误。

我在我的Windows 8主机上以VMware客户机的形式运行了Ubuntu 12.10。
我在Windows 8主机上共享了一个文件夹,并且在Ubuntu客户机启动时通过fstab中的条目挂载。
//myhost/work /work cifs credentials=/home/user/.smbcredentials,noserverino,nounix,uid=user,gid=user,file_mode=0777,dir_mode=0777 0 0 

分享功能正常,可以通过像nginx这样的web服务器进行提供。
然而,当我使用npm安装node.js包时,似乎出现了一些问题,我会遇到很多类似这样的错误:
user@ubuntu:/work/test$ sudo npm install grunt
npm http GET https://registry.npmjs.org/grunt
npm http 304 https://registry.npmjs.org/grunt
...
npm ERR! error rolling back Error: ENOTEMPTY, rmdir '/work/test/node_modules/grunt/node_modules/lodash'
npm ERR! error rolling back  grunt@0.4.1 { [Error: ENOTEMPTY, rmdir '/work/test/node_modules/grunt/node_modules/lodash']
npm ERR! error rolling back   errno: 53,
npm ERR! error rolling back   code: 'ENOTEMPTY',
npm ERR! error rolling back   path: '/work/test/node_modules/grunt/node_modules/lodash' }
npm ERR! Error: UNKNOWN, symlink '../which/bin/which'
npm ERR! If you need help, you may report this log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <npm-@googlegroups.com>

npm ERR! System Linux 3.5.0-26-generic
npm ERR! command "/usr/bin/node" "/usr/bin/npm" "install" "grunt"
npm ERR! cwd /work/test
npm ERR! node -v v0.10.0
npm ERR! npm -v 1.2.14
npm ERR! path ../which/bin/which
npm ERR! code UNKNOWN
npm ERR! errno -1
npm ERR! Error: ENOENT, chmod '/work/test/node_modules/grunt/node_modules/findup-sync/test/fixtures/aaa.txt'
npm ERR! If you need help, you may report this log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <npm-@googlegroups.com>

npm ERR! System Linux 3.5.0-26-generic
npm ERR! command "/usr/bin/node" "/usr/bin/npm" "install" "grunt"
npm ERR! cwd /work/test
npm ERR! node -v v0.10.0
npm ERR! npm -v 1.2.14
npm ERR! path /work/test/node_modules/grunt/node_modules/findup-sync/test/fixtures/aaa.txt
npm ERR! fstream_path /work/test/node_modules/grunt/node_modules/findup-sync/test/fixtures/aaa.txt
npm ERR! fstream_type File
npm ERR! fstream_class FileWriter
npm ERR! fstream_finish_call chmod
npm ERR! code ENOENT
npm ERR! errno 34
npm ERR! fstream_stack /usr/lib/node_modules/npm/node_modules/fstream/lib/writer.js:305:19
npm ERR! fstream_stack Object.oncomplete (fs.js:93:15)
npm ERR! Error: ENOENT, lstat '/work/test/node_modules/grunt/node_modules/minimatch/test/basic.js'
npm ERR! If you need help, you may report this log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <npm-@googlegroups.com>

npm ERR! System Linux 3.5.0-26-generic
npm ERR! command "/usr/bin/node" "/usr/bin/npm" "install" "grunt"
npm ERR! cwd /work/test
npm ERR! node -v v0.10.0
npm ERR! npm -v 1.2.14
npm ERR! path /work/test/node_modules/grunt/node_modules/minimatch/test/basic.js
npm ERR! fstream_path /work/test/node_modules/grunt/node_modules/minimatch/test/basic.js
npm ERR! fstream_type File
npm ERR! fstream_class FileWriter
npm ERR! code ENOENT
npm ERR! errno 34
npm ERR! fstream_stack /usr/lib/node_modules/npm/node_modules/fstream/lib/writer.js:284:26
npm ERR! fstream_stack Object.oncomplete (fs.js:93:15)
npm ERR! Error: ENOENT, lstat '/work/test/node_modules/grunt/node_modules/glob/test/00-setup.js'
npm ERR! If you need help, you may report this log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <npm-@googlegroups.com>
...
npm ERR! not ok code 0
user@ubuntu:/work/test$ 

什么可能导致这个问题?从命令行上,我可以使用sudo来执行chmod、rmdir等操作而没有任何问题。
6个回答

使用--no-bin-links运行解决了我的问题。
npm install --no-bin-links

--no-bin-links告诉npm不要创建任何符号链接。

偶尔,对于一些即使使用--no-bin-links指令也会创建符号链接的包,或者在使用此指令导致其他错误的情况下,您可以使用以下命令从显示错误的包中删除符号链接:

npm unlink <package>

绝对没有办法将符号链接翻译成Windows共享。

16我希望我能再给你点赞200次。这使得在Windows上使用Vagrant成为可能。 - Clint
1npm install --no-bin-link 也可以正常工作。 - JamieJag
2很棒的答案!但是有没有办法让这个方法适用于Grunt的package.json文件中的“devDependencies”?那将会非常棒 :) - Jelmer
1谢谢!Vagrant应该将这个放在他们的官方Windows文档中。我的所有积分都归你所有。 - htxryan
我无法使用--no-bin-links选项运行grunt命令。 - anatoly techtonik
我找到了一个解决方案,可以与gulp和grunt一起使用,请看下面的内容。 - Edu Ruiz
1谢谢你,你救了我的一天,我已经挣扎了一整天。 - Manjunath Siddappa

如何在Windows上允许创建符号链接 这个页面 对我有很大帮助,它解释了即使您的共享文件夹可写也会发生这种情况。

要修复这个问题,您需要在VirtualBox中启用符号链接功能。

在命令提示符下运行:

VBoxManage setextradata YOURVMNAME VBoxInternal2/SharedFoldersEnableSymlinksCreate/YOURSHAREFOLDERNAME 1

然后通过验证:
VBoxManage getextradata YOURVMNAME enumerate

如果您的用户属于管理员组,请使用“以管理员身份运行”启动VirtualBox! 默认情况下,Windows 7安全策略不允许创建符号链接,因为这可能会造成安全威胁。运行“secpol.msc”,导航到“本地策略-用户权限分配”,将您的用户添加到“创建符号链接”。我没有尝试过,但是在此之后,可能可以以普通用户身份运行virtualbox。

同意lorem的观点,但这还不够。
  1. 在Windows上以管理员身份运行Virtualbox。

  2. 确保你执行了以下命令:VBoxManage.exe setextradata YOUR_VM BoxInternal2/SharedFoldersEnableSymlinksCreate/YOUR_SHARED_FOLDER 1

将YOUR_VM和YOUR_SHARED_FOLDER替换为你的值。 你可以通过以下命令检查该值:VBoxManage.exe getextradata boot2docker-vm enumerate

有一个Virtualbox bug正在跟踪这个问题。


VirtualBox的新版本应该允许使用符号链接,只要你以管理员身份启动VirtualBox(右键点击:以管理员身份运行)。
对于vagrant boxes也是一样的:只需以管理员身份运行cmd.exe/PowerShell,就可以顺利进行。

对我来说,这些答案都没有起作用。我不确定为什么,但我相信是因为我的共享是nfs。所以,即使以管理员身份运行并更改setextradata设置,我也无法让它允许符号链接。我正在使用gulp和其他一些似乎不遵循--no-bin-links的软件包。它仍然试图创建一些符号链接,显然是失败了。最后,Github上的这个帖子给了我一个"解决方案",虽然有点hacky。我"简单地"将项目安装在非共享文件夹中,并将其设置为我的NODEPATH。
export NODE_PATH=/home/vagrant/PROJECTNAME/node_modules

注意的是,这将影响整个服务器和更新/更改包装的工作流程。

this npm issue中,@drmyersii提供了一个很好的解决方案,我只需要复制粘贴,不链接答案。
引用: 真正的解决方案是在Vagrantfile中设置配置,允许Windows主机上的符号链接。这里有一个示例(假设您在VirtualBox中运行):
config.vm.provider "virtualbox" do |v|
    v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/vagrant", "1"]
end

这对我来说非常有效,现在我可以使用gulp和scotchbox了。

  • 相关问题