node.js - 节点npm windows文件路径太长,无法安装包

情况

我想在Windows托管的开发环境中使用gulp和相关的前端工具链。 我正试图使用像Browser-Sync这样的gulp插件,因为node_modules文件夹图表会让Windows文件路径过长而无法复制文件。 我想在Windows上处理这个问题的实用方法,无论Node社区可能提供或不提供什么来改善Windows上的npm可用性。

2个问题

  1. Windows的npm工作流程是否按照预期的方式工作? “运行命令和文件安装”(例如,与OSX上的npm,Linux上的npm,ruby gems甚至是nuget相比)我不想在每次使用时都乱用一堆手动文件编辑,符号链接等 在Windows上的npm。

  2. 是否有一个记录良好,稳定的Cygwin工作流,用于npm和节点执行,以解决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一起工作,但似乎还存在其他问题。

我目前的黑客

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

其他难吃的解决方法

符号链接可用于缩短文件路径,但这些是kludgy hacks。 随着npm生态系统的增长,嵌套的依赖链将变得太长,这种解决方法变得无法使用。

在我遇到的一个线程中提到了将所有依赖项添加到根文件夹的package.json文件中。 虽然这种方法会使文件夹结构变平并防止加载重复模块,但这种解决方法感觉不自然。 它还会破坏npm的可用性,持久性和生产力,因为你必须手动或使用一些hacky脚本来安装文件和文件夹。 这种方法也容易受到符号链接方法可能最终遭受的同样命运的影响。

Allan McLemore asked 2019-09-10T01:39:22Z
9个解决方案
55 votes

从npm版本3.1.0开始,Windows上深层嵌套文件夹的问题已基本解决。

据npm说:

.npm @ 3通过将所有内容提升到顶级node_modules来使安装“最大化”。 这意味着嵌套只发生在冲突上,因此树不应该变得非常深。 因此,不应该遇到窗口路径长度限制。

我刚刚安装了npm 3.1.0并在一个抛出可怕的The specified path, file name, or both are too long错误的软件包上试用了它。

问题消失了。

你可以从这里获得最新的npm版本:npm发行版

biofractal answered 2019-09-10T01:40:08Z
19 votes

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

  • 打开组策略编辑器(按Windows + R并键入gpedit.msc并按Enter键)
  • 导航到以下目录:本地计算机策略\计算机配置\管理模板\系统\文件系统
  • 双击“启用Win32长路径”选项并启用它。

enter image description here

Marcelo Mason answered 2019-09-10T01:40:51Z
12 votes

这是一种解决方案。

有一些节点模块可以为您平衡依赖关系。
链接在这里:

  • NPM-压扁
  • NPM-重复数据删除

这些模块正在做什么也可以手动完成。 这是迄今为止唯一存在的真正解决方案,即将所有模块放在一个单独的级别上,彼此需要,而不是所有模块都具有深深嵌套的依赖项的私有副本。

Amol M Kulkarni answered 2019-09-10T01:41:47Z
3 votes

艾伦 -

从您链接的github问题,

npm默认会在安装时添加重复数据删除。 这比Node的模块系统更改明显更可行,但它仍然不是很简单,并且需要对一些长期存在的模式进行大量的重新处理。

这是(终于)目前在npm的工作,名为multi-stage-install,目标是npm@3. npm开发主管Forrest Norvell将在新的一年中花一些时间在Windows上运行,所以请创建与windows相关的 npm问题跟踪器上的问题<[https://github.com/npm/npm/issues]>

Sam Mikes answered 2019-09-10T01:42:31Z
3 votes

我有同样的问题。 展平依赖项并不是一个完整的解决方案,因为您可能正在使用依赖于同一依赖模块的不同版本的模块。 我发现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\注册表的URL\ node_modules\ npmconf\ node_modules\ CONFIG链\ 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中是正确的,因此该解决方法适用于其他开发人员和构建服务器,而无需任何手动或全局烦恼。

Stefan Mohr answered 2019-09-10T01:44:31Z
2 votes

如果你可以全局安装它,这可能是一个解决方法:

您可以将npm安装全局模块的路径调整为非常短的路径(通常是c:\ users \ {username} \ AppData \ Roaming \ npm \ npm_modules),它占用了很多字符。

要调整它,请参阅此处:更改Windows中node.js模块的默认全局安装目录?

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

gwildu answered 2019-09-10T01:45:16Z
0 votes

这是最终为我修好的......

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

当您看到包失败时,请使用--no-bin-link手动安装它。

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

其中{package}是有问题的包。

在所有这些之后,我在插件'gulp-notify'中收到错误消息:未找到:notify-send。

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

export DISABLE_NOTIFIER=true;

或者使用Vagrant安装插件。

祝你好运..即使遵循了很多人的建议,我也花了很长时间。

布兰登

user3310182 answered 2019-09-10T01:46:36Z
0 votes

在Windows中:

  1. 使用您的Windows资源管理器,导航到您的流浪汉共享文件夹(我顺便使用scotchbox),例如npm install
  2. 在文件夹的地址栏中,键入npm install,然后按Enter键
  3. 你的gulp安装npm install
Justis Matotoka answered 2019-09-10T01:47:20Z
0 votes

npm install --no-bin-link.您将有一个完整的扁平化node_modules

Ken Berkeley answered 2019-09-10T01:47:45Z
translate from https://stackoverflow.com:/questions/26155135/node-npm-windows-file-paths-are-too-long-to-install-packages