Nodejs + npm,在ntfs分区上安装模块

35

在安装npm模块时,我遇到了一个问题。NodeJS已安装在运行于Windows主机上的Virtual Box上的Ubuntu 11.10上。我的项目文件位于NTFS分区(必须与Windows共享)。当我尝试安装某些npm模块时,会出现错误,并且模块未安装。我发现当npm尝试创建符号链接时,问题会发生。

可能无法在NTFS分区上创建符号链接,但当我在“内部”Linux文件系统中安装模块时,一切正常。

我该如何解决这个问题?我不想手动解析依赖关系 :/


1
我认为NTFS确实有符号链接的等效物,但只能由管理员使用,而且没有在Linux上被广泛使用,所以可能NTFS驱动程序不支持它。 - thejh
有什么想法如何修复它吗? - Sosnowski
7个回答

56
自1.2.21版本起,npm的install命令有了一个新选项:--no-bin-links。您可以使用它来安装特定的Node模块。
npm install express --no-bin-links

还适用于 package.json 安装

npm install --no-bin-links

使用这个选项,我已经能够在虚拟机内的共享文件夹中安装许多npm模块,没有任何问题(Ubuntu客户机,Windows主机)。
添加该选项到npm代码的提交是b4c58617039c21c10889a9869f8e86a23e17d3a0

1
这太棒了!Sosnowski提供了一个快速解决方案,不需要像@Mahbub建议的那样在每个工作站上设置vbox设置。 - antitoxic
1
这应该被标记为正确答案。在花费数小时尝试修复并且我调整我的cifs挂载时,认为这是某些权限问题,这对我有所帮助。 - F21
1
这是一个非常棒的解决方案! - Jaro
非常感谢 @blackjid。 - Chandu
这也会影响到Windows子系统的Linux,所以我很高兴已经针对NTFS文件系统进行了捕捉。 - John Reid

5

1
在我运行npm install之后,仍然显示Error: UNKNOWN, symlink '../coffee-script/bin/cake' - antitoxic
哎呀 - 我需要以管理员身份运行整个 VBox。现在它可以正常工作,但每次以管理员身份运行仍然有点麻烦。 - antitoxic
我知道这很麻烦 :), 但你可以将虚拟机设置为始终以管理员身份运行。右键单击虚拟盒 > 属性 > 快捷方式 > 高级... > 以管理员身份运行。 - Mahbub
你尝试过使用Vagrant吗?看看这个链接 - https://github.com/mitchellh/vagrant/issues/713#issuecomment-4416384 - Mahbub
损坏的链接:“页面未找到...” - Samuel Rossille

5
符号链接权限或者使用--no-bin-links参数对我们没有效果。相反,我们选择将node_modules移出/vagrant共享文件夹。我们在/vagrant/node_modules/tmp/node_modules之间创建了一个符号链接。您只能这样做如果您的node_modules不在版本控制中。请先查看此文

另外请参见http://kmile.nl/post/73956428426/npm-vagrant-and-symlinks-on-windows


3
我非常确定在共享驱动器(“共享文件夹”)上无法创建符号链接。尤其是在Windows主机和Linux客户端之间更加不可能。
主机机器不知道客户机的文件系统。对于主机来说,客户机就是黑盒子。当主机不知道/etc在哪里时,你不能告诉主机 “好吧,这个链接指向/etc/... :)。
因此,简而言之:不幸的是,不行。
更详细地说:
如果我错了,我会很高兴!这给我的开发过程带来了很大的困扰。
我尝试了很多选项。默认情况下,“共享文件夹”使用的文件系统是vboxsf,与samba(Windows的默认网络共享协议)相同或相似,因此:
1. 我尝试使用本地Windows网络共享,然后将网络驱动器作为guest挂载,因为guest和host在同一个网络上。问题仍然存在。
2. 我在Windows上运行了NFS服务器(Hanewin NFS Server),同时还有SFU/SUA(适用于UNIX的Windows服务),但这会导致GIT锁定问题。可能还有其他问题 - 那是很久以前的事了,我记不清了。
3. 我尝试反过来:在虚拟机上共享一个目录给Windows。但是这很愚蠢,因为所有文件都在虚拟盒子上,并且在Windows上访问速度非常慢。
4. 我有点傻,认为“好吧,让我们在Windows和Linux上都挂载一个虚拟驱动器” - 不要尝试这样做,它会破坏虚拟磁盘。这是我应该知道的事情。
也许还有一种网络共享协议可以在尝试创建符号链接时复制文件?我不确定。
但是,我还没有找到这个,而且锁定似乎是文件系统本身的任务,所以我怀疑任何网络协议(除非具有一些专门用于锁定的注册表)可以做到这一点。

1

对于那些在尝试了npm install --no-bin-links后仍然遇到此问题的人。

当我在Windows 7主机上使用VirtualBox运行Laravel Homestead Vagrant box时,遇到了类似的问题,在运行npm install时,无法使以上任何解决方案起作用。客户机框架已经映射到Windows文件系统。

该问题导致出现各种错误消息和失败的包安装。最相关的一个是npm ERR! UNKNOWN, symlink '<some filename>'

为了解决这个问题,我成功地在Windows Git bash命令行上运行了npm install,而不是在客户Linux上运行。

要做到这一点,你需要在Windows上安装Git和NodeJS。

例如:

  1. 安装Chocolateyhttps://chocolatey.org/
  2. choco install nodejs.install
  3. choco install git.install
  4. 运行C:\Program Files (x86)\Git\Git Bash.vbs
  5. 在Git Bash命令行中,更改目录到您的package.json文件所在的位置,例如cd /c/projects/projectname
  6. 运行npm install

一切似乎都成功安装了。


0

如果您不使用本地模块(从C / C ++编译),则可以在Ubuntu VM上使用npm,并将node_modules文件夹复制到Windows驱动器中。


0

fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1

这个命令可以在Windows上启用符号链接。要了解末尾的神秘命令的更好解释,请访问:如何在Server 2008上获取符号链接目标时克服“符号链接无法被跟踪,因为其类型已禁用”错误?

总之

fsutil行为设置SymlinkEvaluation的行为代码 - 即L2L、L2R、R2L和R2R - 的含义如下:

L代表“本地”,R代表“远程”(谁会想到呢?) 2前面的第一个L或R是指链接本身(而不是其目标)相对于访问链接的机器的位置。 2后面的第二个L或R是指链接目标相对于LINK本身所在的机器的位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接