节点npm windows文件path太长,无法安装软件包
情况
我想在Windows托pipe的开发环境中使用gulp和相关的前端工具链。 我正在尝试使用诸如Browser-Sync之类的gulp插件,因为node_modules文件夹graphics扇出Windows文件path太长而无法复制文件。 我想现在在Windows上处理这个问题的一个实用的方法,无论Node社区将来可能提供或不提供的npm在Windows上的可用性。
2个问题
-
是否有一个Windows的npm工作stream程,只是按照预期的方式工作? “运行命令和文件安装”(例如,可以与OSX上的npm,Linux上的npm,ruby gems甚至nuget相媲美)每次我使用时,我都不想摆弄一大堆手动文件编辑,符号链接等Windows上的npm。
-
是否有一个良好的文档,稳定的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@3
。 npm
开发主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中:
- 使用你的Windows资源pipe理器,导航到你的vagrant共享文件夹(我正在使用scotchbox)例如
C:\scotchbox/public/gulpProject
- 在文件夹的地址栏中,input
cmd
并按Enter键 - 做你的一口气安装
npm install
npm install --no-bin-link
。 你将有一个完整的平面 node_modules