节点npm Windows文件路径太长,无法安装软件包


88

情况

我想在Windows托管的开发环境中使用gulp和相关的前端工具链。我碰到一堵墙,试图使用浏览器同步之类的gulp插件,因为node_modules文件夹图呈扇形散开,使得Windows文件路径太长而无法复制文件。我想采用一种务实的方法来立即在Windows上处理此问题,而不管Node社区将来可能会或可能不会提供什么以改善Windows上的npm可用性。

2个问题

  1. 是否有Windows的npm工作流程能够按预期的方式工作?“运行命令并安装文件”(例如,相当于OSX上的npm,Linux上的npm,ruby gem甚至是nuget)我不想每次都使用大量手动文件编辑,符号链接等摆弄在Windows上为npm。

  2. 是否存在针对npm和节点执行的有据可查的,稳定的Cygwin工作流程,以解决Windows API文件路径限制?

以下列出的血腥细节...

一般问题

  • 从标准Windows命令提示符运行npm install在深度嵌套的node_modules层次结构上失败。
  • Per Joyent的github repo线程,这是一个公认的问题,对于以Windows为中心的环境中的开发人员而言,没有可口的解决方法。(真的吗?
  • NT内核最多支持32,767个字符的文件路径长度。
  • Windows API的MAXPATH限制为260个字符。
  • Windows API处理所有主要Windows Shell的文件操作,但不包括:Explorer,CMD,Powershell,MYSgit bash等。(MS真的吗?NTFS已经存在多长时间了?
  • Cygwin支持长文件路径,但是由于crlf格式,npm.cmd不能开箱即用。我尝试在npm上进行DOS2Unix转换,以使其与Cygwin一起使用,但是似乎还有其他问题。

我目前的骇客

  • 在C:\的根目录上创建一个“ n”文件夹作为暂存区域,因为这会缩短我的文件夹路径。
  • 在“ n”文件夹中运行npm以安装我需要的模块。
  • 启动Cygwin,并使用cp将node_modules文件夹复制到目标项目中。
  • 当依赖项更改或需要启动新项目时,请冲洗并重复。

其他不适口的解决方法

符号链接可用于缩短文件路径,但这些都是笨拙的技巧。随着npm生态系统的发展,嵌套的依赖链将变得太长,并且这种解决方法变得不可用。

我遇到的一个线程提到将所有依赖项添加到根文件夹的package.json文件中。尽管此方法将使文件夹结构变平并防止加载重复的模块,但是这种解决方法让人感到不自然。它还会破坏npm的可用性,耐用性和生产率,因为您必须手动或手动使用一些骇客脚本来摆弄安装后的文件和文件夹。这种方法也容易受到符号链接方法最终可能遭受的命运的影响。


我几乎以为我解决了这个问题。通过在以下2个文件上运行dos2unix util,我使Cygwin与npm一起工作:npm.cmd和npm
Allan McLemore

Windows API路径限制使npm无法使用,因为某些npm模块使用Visual Studio生成文件。这是我在npm Browser-Sync中收到的错误:C:\ Program Files(x86)\ MSBuild \ Microsoft.Cpp \ v4.0 \ V120 \ Microsoft.CppBuild.targets(301,5):错误MS B3491:可以不要将行写入文件“ Release \ obj \ validation \ validation.tlog \ validation.lastbuilds tate”。指定的路径,文件名或两者都太长。完全限定的文件名必须少于260个字符,目录名称必须少于248个字符。
Allan McLemore

我可能有一种“太妃糖拉动”的方法来在Windows上用npm加载节点模块。它涉及以下几回合:npm install,npm重复数据删除,npm收缩和rm -r node_modules。反复执行此操作似乎在某种程度上消除了长文件路径,但这有点像拉太妃糖(例如,直到完成后才完成)。是否有人对此进行了编纂或编写了自动化工具以使其更完善?
Allan McLemore

说到“ hacky脚本”,我写了一篇我认为不是TERRIBLY hacky的脚本。我创建了一个名为fenestrate的工具,您可以在安装后使用该工具以编程方式展平模块的目录结构。您可以将其安装为全局npm postinstall挂钩。
zetlen 2014年

2
@yoneal为了个人使用并快速上手,fenestrate应该递归地遍历node_modules文件夹,因此您无需在较深的依赖项上手动运行它。但是,分叉这些依赖关系将是非常棒的-我认为许多具有简单特征配置的分叉模块会向npm维护者传达一个很好的信息。
zetlen 2014年

Answers:


58

从npm版本开始,Windows上的深度嵌套文件夹的问题已得到解决3.x

根据npm:

.npm @ 3通过将所有可能的一切提升到顶层node_modules,从而使安装“最大程度地平坦”。这意味着嵌套仅在冲突时发生,因此,树永远不会变得很深。因此,不应碰到Windows路径长度限制。

我刚刚安装了npm3.1.0并在抛出可怕The specified path, file name, or both are too long错误的程序包上进行了尝试。

问题消失了。

您可以从此处获取最新的npm版本:npm版本


4
我在Windows机器上的npm 3.x更新中也取得了成功。无耻插头:我写了在Windows上约3故宫的文章triplet.fi/blog/...
Tx3上

21

Windows 8.1和Windows 10具有增加Win32路径限制的选项:

  • 打开组策略编辑器(按Windows+R并键入gpedit.msc并单击Enter
  • 导航到以下目录: Local Computer Policy\Computer Configuration\Administrative Templates\System\Filesystem
  • 双击“启用Win32长路径”选项并启用它。

在此处输入图片说明


选项对我不可用,并且我从Win 7 Pro升级了,所以这可能是原因
Evan Morrison

@EvanMorrison“文件系统\ NTFS \启用NTFS长路径”在以后的win10版本中已重命名为“文件系统\启用Win32长路径”。我更新了答案,以备将来参考。
马塞洛·梅森

1
Win Server 2012 R2的任何想法
sairfan '17


3

艾伦-

从您链接的github问题中,

默认情况下,npm将在安装时添加重复数据删除功能。这远比更换Node的模块系统更可行,但仍然不完全是琐碎的事,并且涉及许多对某些根深蒂固的模式的重新设计。

(最终)该名称目前在npm中正在使用,其名称multi-stage-installnpm@3npm开发负责人Forrest Norvell将在新的一年中花一些时间在Windows上运行,因此请务必在npm问题跟踪器上创建与Windows相关的问题< https://github.com/npm/npm/issues >


3

我有同样的问题。扁平化依赖关系不是一个完整的解决方案,因为您可能正在使用依赖于同一依赖模块的不同版本的模块。我发现gulp-run模块在展平后停止工作(我怀疑与bin / .bin目录有关的模块假设)。德拉特!

关于这个问题有很多讨论,但是看不到解决方案:https : //github.com/joyent/node/issues/6960

https://github.com/npm/npm/issues/3697

对我有用的解决方法是手动添加项目不需要的依赖。

如果您想确定哪个软件包给您带来了问题,我发现PathLengthChecker非常有用。只需解压缩EXE并运行GUI或命令行应用程序即可。我发现问题的另一种方法是尝试在Visual Studio中进行构建,但是失败却没有告诉您哪个目录名太长。

这是我的解决方法的命令行示例:

mkdir c:\reallylongdirectorywillbreakinwindows
cd c:\reallylongdirectorywillbreakinwindows
npm init
npm install --save-dev grunt-bower-task
PathLengthChecker.exe RootDirectory="C:\reallylongdirectorywillbreakinwindows" MinLength=260

我回来了:

261:C:\ reallylongdirectorywillbreakinwindows \ node_modules \ grunt-bower-task \ node_modules \ bower \ node_modules \ update-notifier \ node_modules \ latest-version \ node_modules \ package-json \ no de_modules \ registry-url \ node_modules \ npmconf \ node_modules \配置链\ readme.markdown

[截图-其中有12个]

根据npm ls命令:

└─┬ grunt-bower-task@0.4.0
  ├── async@0.1.22
  ├─┬ bower@1.3.12
  │ ├─┬ update-notifier@0.2.0
  │ │ ├─┬ latest-version@0.2.0
  │ │ │ └─┬ package-json@0.2.0
  │ │ │   └─┬ registry-url@0.1.1
  │ │ │     └─┬ npmconf@2.1.1
  │ │ │       ├─┬ once@1.3.1
  │ │ │       │ └── wrappy@1.0.1

让我们来看一下npmconf-它是所有导致问题的超长文件的容器。我们需要npmconf 2.1.1。

npm install --save-dev npmconf@2.1.1
(now delete the node_modules directory - you may have to use Windows Explorer if you can't do it with rmdir /s)
npm install
PathLengthChecker.exe RootDirectory="C:\reallylongdirectorywillbreakinwindows" MinLength=260

没有结果-所有文件都在限制范围内!

这里明显的警告是,每个软件包只能使用一次-不能在根node_modules级别上安装对同一模块不同版本的依赖项,因为node不考虑目录结构中的版本。

这个解决方法不是完美的,但是它解决了我在Windows上运行节点的主要目标,并且由于解决方案在package.json中是正确的,因此该解决方法适用于其他开发人员和构建服务器,而无需任何手动或全局麻烦。


2

如果可以在全球范围内安装它,可以采用以下解决方法:

您可以将npm安装全局模块的路径调整得很短(通常是: c:\users\\{username}\AppData\Roaming\npm\npm_modules,该位置已经需要很多字符。

要对其进行调整,请参见此处: 在Windows中更改node.js模块的默认全局安装目录?

如果将其调整为(例如)c:\n\在某些情况下,它可能会解决该问题。


1

这就是最终为我解决的问题...

安装gulp并收到错误后,运行... gulp

如果发现软件包失败,请使用手动安装--no-bin-link

sudo npm install {package} --no-bin-link

其中{package}是遇到问题的软件包。

完成所有这些操作后,我在插件“ gulp-notify”中收到错误消息:未找到:notify-send。

这是由于Vagrant的插件问题引起的。您可以关闭通知。

export DISABLE_NOTIFIER=true;

或使用Vagrant安装插件。

祝您好运。即使遵循了很多人的建议,我仍然花了很长时间。

布兰登


0

在Windows中:

  1. 使用Windows资源管理器,导航到您的无业游民的共享文件夹(顺便说一句,我正在使用scotchbox),例如 C:\scotchbox/public/gulpProject
  2. 在文件夹的地址栏中,键入cmd并按Enter
  3. 做你的gulp安装 npm install

1
避免复制粘贴相同的答案。您应该将其标记为重复。此外,请勿在您的帖子中发誓。
Tunaki

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.