我运行的是 Windows 10、NPM v5.5.1 和 Node v8.9.1。
编辑:我已经更新到 Node v8.9.4 和 npm v5.6.0。 问题依旧。
我大约两个月前在这台机器上设置了我的开发环境。 我正在使用 Angular CLI 构建我的客户端应用程序。
一切都很顺利。 我通过 NPM 添加了一些软件包,没有出现问题,例如 Gulp 和 ngx-bootstrap。 然后我开始在一些软件包安装中遇到错误。
错误是:
npm ERR! code PATH_LENGTH_EXCEEDED
npm ERR! errno PATH_LENGTH_EXCEEDED
npm ERR! request to https://registry/npmjs.org/{{package}} failed, reason: path length constraint exceeded
npm ERR! A complete log of this run can be found in:
npm ERR! {{npm_cache path}}\_logs\2018-02-08T14_43_40_856Z-debug.log
该日志文件的内容是:
0 info it worked if it ends with ok
1 verbose cli [ 'C:\\Program Files\\nodejs\\node.exe',
1 verbose cli 'C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js',
1 verbose cli 'install',
1 verbose cli 'ngx-cookie-service',
1 verbose cli '--save' ]
2 info using [email protected]
3 info using [email protected]
4 verbose npm-session d55be12849534a0a
5 silly install loadCurrentTree
6 silly install readLocalPackageData
7 silly fetchPackageMetaData error for ngx-cookie-service@latest request to https://registry.npmjs.org/ngx-cookie-service failed, reason: path length constraint exceeded
8 verbose type system
9 verbose stack FetchError: request to https://registry.npmjs.org/ngx-cookie-service failed, reason: path length constraint exceeded
9 verbose stack at ClientRequest.req.on.err (C:\Program Files\nodejs\node_modules\npm\node_modules\pacote\node_modules\make-fetch-happen\node_modules\node-fetch-npm\src\index.js:68:14)
9 verbose stack at emitOne (events.js:116:13)
9 verbose stack at ClientRequest.emit (events.js:211:7)
9 verbose stack at TLSSocket.socketErrorListener (_http_client.js:387:9)
9 verbose stack at emitOne (events.js:116:13)
9 verbose stack at TLSSocket.emit (events.js:211:7)
9 verbose stack at emitErrorNT (internal/streams/destroy.js:64:8)
9 verbose stack at _combinedTickCallback (internal/process/next_tick.js:138:11)
9 verbose stack at process._tickCallback (internal/process/next_tick.js:180:9)
10 verbose cwd C:\Development\test
11 verbose Windows_NT 10.0.15063
12 verbose argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "install" "ngx-cookie-service" "--save"
13 verbose node v8.9.1
14 verbose npm v5.5.1
15 error code PATH_LENGTH_EXCEEDED
16 error errno PATH_LENGTH_EXCEEDED
17 error request to https://registry.npmjs.org/ngx-cookie-service failed, reason: path length constraint exceeded
18 verbose exit [ 1, true ]
我对此进行了研究,发现Windows 10文件路径260个字符的限制。 我认为 npm 版本 3.1.0 应该已经解决了这个问题,但我决定按照这个答案中的说明进行操作,因为尽管使用了 NPM v5.5.1,但我仍然遇到了这个问题。
我发现我的 Windows 版本早于推出可让您禁用此限制的功能。 我更新到版本 1703(操作系统内部版本 15063.483),并启用 Win32 长路径。
但是我仍然收到错误,并且无法安装各种 npm 包。
在测试是否是具有大量依赖项的软件包出现问题时,我尝试安装或重新安装其他几个软件包。
有些会因上述错误而失败。 其他人成功后出现以下警告:
npm WARN Unexepcted warming for https://registry.npmjs.org/: Miscellaneous Warning PATH_LENGTH_EXCEEDED: request to https://registry.npmjs.org/{{package name}} failed, reason: path length constraint exceeded
npm WARN Using stale package data from https://registry.npmjs.org/ due to a request error during validation
抛出错误的包包括: jslint ngx-cookie-服务 图表.js 角度-cli
引发警告的包包括: 字体真棒 @角度/cli 片刻 ngx引导程序 引导程序 茉莉花
我怀疑是我的工作站上的策略或我们的网络安全发生了某些变化,导致了这种情况。 所有成功的软件包似乎都是我之前安装的软件包,要么作为直接安装,要么作为 @angular/cli 的依赖项(我安装的第一个软件包之一)。 我假设过时的包数据警告表明我在路径长度方面遇到的任何问题都会阻止检索更新的数据,因此 npm 会回退到所选包及其依赖项的先前安装中的缓存数据。
所以现在我很困惑如何准确诊断问题发生的位置。 如果安全策略发生了变化,那么我需要能够准确描述被阻止的内容,以便我可以与我们的安全部门合作解决此问题。 但我能找到的关于 PATH_LENGTH_EXCEEDED 错误的唯一信息引导我找到有关 3.1.0 之前的 npm 版本的旧信息。
如何确定此问题的根源?
经过额外搜索,我发现有关 SSL/TLS 证书颁发机构的路径长度超出的引用。 我通过更改 npm 注册表以使用 http 而不是 https 来测试此问题(注意:这只是一个临时步骤;验证问题后我已重新打开 https):
npm config set registry http://registry.npmjs.org/
这使我能够安装有问题的软件包。
根本原因似乎是我们的网络安全团队执行的 SSL 检查。 解密、检查和重新加密过程以及证书颁发机构的后续更改显然会触发此错误。
当您的公司制定了激进的网络安全政策(包括某种中间人代理)时,就会发生这种情况。在这种情况下,将公司证书添加到节点可能会有所帮助,以便它可以验证代理(您的公司)有效发出的包。
请参阅文档了解更多详细信息: https://nodejs.org/api/cli.html#node_extra_ca_certsfile