2014-10-02 151 views
84

形势节点NPM windows文件路径太长,安装软件包

我想用杯和相关的前端工具链在Windows托管开发环境。我正在尝试使用诸如Browser-Sync之类的gulp插件,因为node_modules文件夹图将扇区窗口文件路径浪费太长以至于无法复制文件。我希望现在在Windows上处理这个问题的实用方法,无论Node社区将来可能提供或不提供的npm在Windows上的可用性。

2问题

  1. 是否有适用于Windows的新公共管理的工作流程,只是工作它的目的的方法是什么? “运行命令和文件安装”(例如,可以与OSX上的npm,Linux上的npm,ruby gems或甚至nuget相媲美)每次我使用时,我都不想摆弄一大堆手动文件编辑,符号链接等Windows上的npm。

  2. 是否有一个记录良好,稳定的Cygwin工作流程,用于npm和节点执行以解决Windows API文件路径限制?下面列出

血淋淋的细节...

一般问题

  • 运行NPM从一个标准的Windows命令提示符下安装失败的深度嵌套node_modules层次。
  • Per Joyent的github repo线程this is an acknowledged issue对于Windows中心环境中的开发人员没有适合的解决方法。 (真的吗?
  • NT内核支持多达32,767个字符的文件路径长度。
  • Windows API的MAXPATH限制为260个字符。
  • 的Windows API处理文件操作对所有主要的Windows外壳和诸如此类的东西,包括:资源管理器中,CMD,PowerShell中,MYSgit庆典等(?MS真的有多久NTFS一直围绕?)
  • Cygwin的支持长文件路径,但由于crlf格式化,npm.cmd无法正常工作。我尝试了npm上的DOS2Unix转换来使它与Cygwin一起工作,但似乎还有其他问题。

我现在的黑客

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

其它不受欢迎的解决办法

符号链接可用于缩短文件路径,但这些缺憾黑客。随着npm生态系统的发展,嵌套的依赖链将变得太长,并且这种解决方法变得无法使用。

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

+0

我几乎以为我这个解决。通过在以下两个文件上运行dos2unix util,我得到了Cygwin与npm的协同工作:npm.cmd和npm – 2014-10-04 00:30:21

+0

Windows API路径限制使得npm不可用,因为一些npm模块使用Visual Studio来构建文件。这是我在npm浏览器同步时收到的错误: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个字符。 – 2014-10-04 00:33:59

+0

我可能有一个“taffy-pulling”方法来获取在Windows上加载npm的节点模块。它涉及以下几个步骤:npm install,npm dedupe,npm shrink和rm -r node_modules。重复这样做似乎在某种程度上消除了长文件路径,但这有点像拉太妃糖(例如,直到你完成了才完成)。任何人编写这个或编写一个自动化工具,使这个更多的交钥匙? – 2014-10-04 03:04:46

回答

12

这是一个解决方案。

有一些节点模块可以为您平整您的依赖关系。
链接在此:

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

+10

我发现[flatten-packages](https://www.npmjs.com/package/flatten-packages)具有良好的记录并且易于使用。 – StriplingWarrior 2015-02-06 23:42:51

3

艾伦 -

从您链接GitHub的问题,

故宫将增加重复数据删除,在安装时默认情况下。这比Node的模块系统改变显着更可行,但它仍然不是微不足道的,并且涉及很多对一些根深蒂固的模式的修改。

这是(最终)目前在故宫的作品,由名称multi-stage-install去,是针对[email protected]npm开发铅阿甘诺维尔是要花费一些时间在新的一年里在Windows上运行,所以请不要在npm问题跟踪< https://github.com/npm/npm/issues>

0

这是最终确定它为我创建窗口相关的问题...

安装杯和接收错误后,运行...一饮而尽

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

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

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

这一切后,我是在插件“吞掉-通知”消息接收错误:未发现:通知,发送。

这是由于Vagrant插件问题。您可以关闭通知..或者安装插件Vagrant

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

布兰登

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 \咕噜鲍尔任务\ node_modules \亭子\ node_modules \ update-notifier \ node_modules \ latest-version \ node_modules \ package-json \ no de_modules \ registry-url \ node_modules \ npmconf \ node_modules \ config-chain \ readme.markdown

[s夹 - 一家总共有12

按照NPM LS命令:

└─┬ [email protected] 
    ├── [email protected] 
    ├─┬ [email protected] 
    │ ├─┬ [email protected] 
    │ │ ├─┬ [email protected] 
    │ │ │ └─┬ [email protected] 
    │ │ │ └─┬ [email protected] 
    │ │ │  └─┬ [email protected] 
    │ │ │  ├─┬ [email protected] 
    │ │ │  │ └── [email protected] 

让我们一起去npmconf - 这是对于那些造成问题的所有超长文件的容器。我们需要npmconf 2.1.1。

npm install --save-dev [email protected] 
(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中正确,解决方法适用于其他开发人员和构建服务器,而无需任何手动或全局性操作。

54

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

据故宫:

.npm @ 3使得安装“最平坦的”吊装就位一切可能的顶级node_modules。这意味着嵌套只发生在冲突上,因此树木不应该变得很深。因此,窗口路径长度限制不应该进入。

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

问题就消失了。

你可以得到最新的NPM从这里建立:npm releases

+4

我还在Windows机器上使用了npm 3.x更新。无耻的插件:我在Windows上写了一篇关于npm 3的文章http://www.triplet.fi/blog/npm-3-will-bring-brighter-future-for-windows-users/ – Tx3 2015-08-08 07:50:15

2

如果你是安装就OK了全球范围内,这可能是一个变通办法:

您可以调整,其中NPM被安装在全球的路径模块的东西很短(通常是c:\ users \ {username} \ AppData \ Roaming \ npm \ npm_modules),这个过程需要很多字符。

要调整它在这里看到:Change default global installation directory for node.js modules in Windows?

如果你把它调整到,例如C:\ n \在某些情况下,它可能会解决这一问题。

0

在Windows中:

  1. 使用Windows资源管理器,浏览到您的无业游民共享文件夹(我用的方式scotchbox)如C:\scotchbox/public/gulpProject
  2. 在文件夹的地址栏中键入cmd,按输入
  3. 做你一饮而尽安装npm install
+1

[避免复制粘贴相同答案](http://stackoverflow.com/a/34587459/1743880)。您应该标记为重复。另外,不要在你的帖子中发誓。 – Tunaki 2016-01-04 08:57:25

0

npm install --no-bin-link。你将有一个整个扁平node_modules

12

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

  • 打开组策略编辑器(按的Windows + [R和类型gpedit.msc并命中输入
  • 导航到以下直接ory:本地计算机策略\计算机配置\管理模板\系统\文件系统
  • 双击启用Win32长路径选项并启用它。

enter image description here

+0

选项不适用于我和fwiw,我从win 7 pro升级,所以这是一个可能的原因 – 2016-09-01 20:59:41

+0

@EvanMorrison“Filesystem \ NTFS \ Enable NTFS long paths”在以后的win10中重命名为“FileSystem \ Enable Win32 long paths”建立。我更新了答案以供将来参考。 – 2016-09-29 23:05:03

+0

Win Server 2012 R2的任何想法 – sairfan 2017-07-11 21:14:13