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

时间:2014-10-02 05:54:38

标签: windows node.js npm filepath

场合

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

2个问题

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

  2. 是否有针对npm和节点执行的文档齐全,稳定的Cygwin工作流来解决Windows API文件路径限制?

  3. 下面列出的血腥细节...

    一般问题

    • 在深层嵌套的node_modules层次结构中,从标准Windows命令提示符运行npm install失败。
    • Per Joyent的github repo帖子this is an acknowledged issue,对于以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脚本来安装文件和文件夹。这种方法也容易受到符号链接方法可能最终遭受的同样命运的影响。

9 个答案:

答案 0 :(得分:55)

Windows上深层嵌套文件夹的问题主要是从npm版本3.x开始解决的。

根据npm:

  

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

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

问题消失了。

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

答案 1 :(得分:19)

Windows 8.1和10可以选择增加Win32路径限制:

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

enter image description here

答案 2 :(得分:12)

这是一种解决方案。

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

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

答案 3 :(得分:3)

艾伦 -

从您链接的github问题

  

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

这是(最终)目前正在npm工作,名称为multi-stage-install,目标是npm@3npm开发负责人Forrest Norvell将在新的一年中花一些时间在Windows上运行,因此请在npm问题跟踪器上创建与Windows相关的问题&lt; https://github.com/npm/npm/issues&gt;

答案 4 :(得分:3)

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

有很多关于这个问题的讨论,但看不到任何解决方案: 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 \配置链\ readme.markdown

     

[snip - 其中有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上使用节点工作的主要目标,并且由于解决方案在package.json中是正确的,因此该解决方法适用于其他开发人员和构建服务器,无需任何手动或全局大惊小怪。

答案 5 :(得分:2)

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

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

要进行调整,请参阅此处:Change default global installation directory for node.js modules in Windows?

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

答案 6 :(得分:0)

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

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

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

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

{package}是有问题的包。

在完成所有这些后,我在插件中收到错误&#39; gulp-notify&#39;消息:未找到:notify-send。

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

export DISABLE_NOTIFIER=true;

或者使用Vagrant安装插件。

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

布兰登

答案 7 :(得分:0)

在Windows中:

  1. 使用您的Windows资源管理器,导航到您的流浪汉共享文件夹(我顺便使用scotchbox),例如C:\scotchbox/public/gulpProject
  2. 在文件夹的地址栏中,输入cmd并按 Enter
  3. 安装你的gulp npm install

答案 8 :(得分:0)

.vendor-list-item { width: 33%; float: left; } 。您将拥有整个展平 npm install --no-bin-link