节点npm windows文件path太长,无法安装软件包

情况

我想在Windows托pipe的开发环境中使用gulp和相关的前端工具链。 我正在尝试使用诸如Browser-Sync之类的gulp插件,因为node_modules文件夹graphics扇出Windows文件path太长而无法复制文件。 我想现在在Windows上处理这个问题的一个实用的方法,无论Node社区将来可能提供或不提供的npm在Windows上的可用性。

2个问题

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

  2. 是否有一个良好的文档,稳定的Cygwin工作stream程npm和节点执行解决Windows API文件path限制?

血淋淋的细节下面列出…

一般问题

  • 从标准的Windows命令提示符下运行npm install会导致深度嵌套的node_modules层次结构失败。
  • 根据Joyent的github repo线程, 这是一个公认的问题 ,在Windows中心环境下对于开发人员来说没有可行的解决方法。 ( 真的吗?
  • NT内核支持长达32,767个字符的文件path。
  • Windows API的MAXPATH限制为260个字符。
  • Windows API处理所有主要的Windows shell的文件操作,包括:资源pipe理器,CMD,Powershell,MYSgit bash等( MS真的吗?NTFS多久了?
  • Cygwin支持长文件path,但由于crlf格式的原因,npm.cmd不能正常工作。 我尝试了npm上的DOS2Unix转换来使它与Cygwin一起工作,但似乎还有其他的问题。

我目前的黑客

  • 创build一个“n”文件夹作为C:\的根目录区域,因为这缩短了我的文件夹path。
  • 在“n”文件夹下运行npm,为我需要的任何东西安装模块。
  • 启动Cygwin并使用cp将node_modules文件夹复制到目标项目中。
  • 当依赖关系发生变化或需要启动新项目时,请清洗并重复。

其他难吃的变通办法

符号链接可以用来缩短文件path,但这些都是黑客攻击。 随着npm生态系统的增长,嵌套的依赖关系链将变得太长,并且此解决方法变得无法使用。

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

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

根据npm:

.npm @ 3通过将所有可以提交到最高级别node_modules的东西安装到“最大限度地平坦”。 这意味着嵌套只发生在冲突,因此,树木永远不会变得很深。 因此,窗口path长度的限制不应该进入。

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

问题消失了。

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

这是一个解决scheme。

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

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

这些模块正在做什么也可以手动完成。 这是目前唯一真正存在的解决scheme,即将所有模块都放在一个层次上,彼此相互需要,而不是所有的模块都拥有深层嵌套的依赖关系的私有副本。

Windows 8.1和10有一个选项来增加Win32path限制:

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

在这里输入图像说明

艾伦 –

从你链接的github问题来看,

npm默认会在安装时添加重复数据删除。 这比Node的模块系统改变显着更可行,但它仍然不是微不足道的,并且涉及到一些根深蒂固的模式的重做。

这是(最后)目前在npm的工作,去名称multi-stage-install ,并针对npm@3npm开发主pipeForrest Norvell将在新的一年中花一些时间在Windows上运行,所以请在npm问题跟踪器< https://github.com/npm/npm/issues >上创build与Windows相关的问题。

我有同样的问题。 展平依赖并不是一个完整的解决scheme,因为你可能使用依赖于相同依赖模块的不同版本的模块。 我发现gulp-run模块在压扁之后停止工作(与模块关于bin / .bin目录的假设有关,我怀疑)。 讨厌鬼!

关于这个问题有很多的讨论,但没有解决scheme: https : //github.com/joyent/node/issues/6960

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

一个解决方法是我的工作是手动添加依赖我的项目不明确需要。

如果你想确定哪些软件包给你带来麻烦,我发现PathLengthChecker相当有用。 只需提取EXE并运行GUI或命令行应用程序。 我发现问题的另一种方法是尝试在Visual Studio中构build,但是在没有告诉你哪个目录名太长的情况下会失败。

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

 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 \configuration链\ 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级别,因为节点没有考虑目录结构中的版本。

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

如果您可以全局安装,那么这可能是一个解决方法:

您可以将npm安装全局模块的path调整为非常短的path(通常是c:\ users \ {username} \ AppData \ Roaming \ npm \ npm_modules),这个path已经有很多字符了。

要调整它,请看这里: 在Windows中更改node.js模块的默认全局安装目录?

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

这是最终解决了这个问题

在安装了gulp并收到错误之后,运行… gulp

当你看到一个包失败时,用--no-bin-link手动安装。

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

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

所有这一切后,我收到错误插件'gulp通知'消息:未find:通知发送。

这是由于Vagrant的一个插件问题。 您可以closures通知

 export DISABLE_NOTIFIER=true; 

或者用Vagrant安装插件。

祝好运..我花了很长时间,甚至在遵循了很多人的build议之后。

布兰登

在Windows中:

  1. 使用你的Windows资源pipe理器,导航到你的vagrant共享文件夹(我正在使用scotchbox)例如C:\scotchbox/public/gulpProject
  2. 在文件夹的地址栏中,inputcmd并按Enter键
  3. 做你的一口气安装npm install

npm install --no-bin-link 。 你将有一个完整的平面 node_modules