如何修复现有文件和符号链接之间的 npm install 冲突?

How do I fix this npm install conflict between existing files & symlinks?

我 运行遇到 NPM 的问题,它似乎检测到现有文件和同名符号链接之间存在冲突。 当从我的项目的根文件夹中 运行ning ls -l 时,我没有看到任何符号链接。我如何弄清楚 NPM 发生了什么并理顺这个冲突?

持续集成构建服务器是 运行ning:Node.js 4.4.3 = 最新的 LTS 构建。

我的本地主机节点 5.x 框切换到使用 phantomjs-prebuilt,由于这个警告...所以更新节点服务器版本从 4.4.3 -> 5.10.1 不是问题,也不是正确的修复:

npm WARN deprecated phantomjs@2.1.7: Package renamed to phantomjs-prebuilt. Please update 'phantomjs' package references to 'phantomjs-prebuilt'

我的任何 *.js 代码中都没有这些,所以我不知道从哪里需要它,也不知道为什么:

require("phantomjs") 
require("phantomjs-prebuilt")

Google & SO 上搜索这个短语,没有产生足够有用的结果来解决我的问题:

"npm ERR! EEXIST: file already exists, symlink"

这是我已经尝试过的 运行ning:

npm uninstall -g phantomjs
npm WARN not installed in /.../.nvm/versions/node/v4/lib/node_modules: "phantomjs"

rm -rf node_modules // to delete that folder
npm install

npm ERR! EEXIST: file already exists, symlink '../phantomjs-prebuilt/bin/phantomjs' -> '/.../node_modules/.bin/phantomjs'
File exists: ../phantomjs-prebuilt/bin/phantomjs
Move it away, and try again.

此错误的截图是使用 Google 在网上找到的。滚动到 CI server's code example 的底部。 (注:那是别人的截图,不过和我的很像。)

使用 npm listnpm ls 显示 phantomjs 已安装:

├── phantomjs@2.1.7

使用npm ls -g 显示空白列表。我认为这意味着没有任何包,也没有安装到全局区域的符号链接。

我尝试使用以下方法卸载 phantomjs:

npm uninstall -g phantomjs
npm WARN not installed in /.../.nvm/versions/node/v4/lib/node_modules: "phantomjs"

我也试过使用 wilmore's idea from his answer at this Homebrew - repeated “linking” bug. What is the underlying issue here? 问题:

brew link --overwrite phantomjs
Warning: Already linked: /usr/local/homebrew/Cellar/phantomjs/2.1.1
To relink: brew unlink phantomjs && brew link phantomjs

这让我从最后一行中选择了第一个选项:

brew unlink phantomjs
Unlinking /usr/local/homebrew/Cellar/phantomjs/2.1.1... 2 symlinks removed

当我重新运行:

npm install

它仍然被这个错误绊倒:

npm ERR! EEXIST: file already exists, symlink '../phantomjs-prebuilt/bin/phantomjs' -> '/.../node_modules/.bin/phantomjs'
File exists: ../phantomjs-prebuilt/bin/phantomjs
Move it away, and try again.

如何进一步调试符号链接并修复现有文件与符号链接之间的 npm install 冲突?

我只是在写完这个问题并尝试重现这个问题后才弄明白,以便其他人可以调试它。因此,这是解决此边缘情况错误的方法,以防将来有人遇到它。

我只是从我的 package.json 文件中删除了这两个,然后重新 运行 npm install 看看会发生什么。然后将它们检查到 CI 服务器,我可以看到它在做什么。我不得不重新添加第一个 "phantomjs" 行以使 CI 服务器通过它的测试。这是必须删除的 "phantomjs-prebuilt" 行。

注释解释了 Node.js 的 4.x 和 5.x 版本应该使用哪个:

"phantomjs": "^2.1.3", // Leave this in for Node 4.x LTS, remove it with 5.x+
"phantomjs-prebuilt": "^2.1.7", // Removed this with 4.x LTS, but use it with 5.x+

这就是修复 CI 服务器并允许测试通过的原因! :)

最初,我一直在使用 Node 5.6.0(2016 年 2 月安装)并且一直在尝试更新一些 Gulp 任务以使用现有的 Node 4.4.3 LTS CI 服务器。

Gulp 在使用 5.6.0 时一直抱怨 phantomJS,所以我安装了 phantomjsphantomjs-prebuilt 以及 --save-dev 以使其停止引起问题。然后从 Node 5.6.0 降级到 4.4.3 LTS 以调试 CI 服务器,会抛出符号链接错误(在我上面的问题中提到)。

因此,如果以后有人遇到此 npm ERR! EEXIST: 问题,请尝试从 package.json 文件中删除所有对 npm 模块的引用 - 错误所提及的。然后,如果您的 CI 服务器需要它们,则逐一重新添加它们。

符号链接将存在于 /node_modules/ 文件夹中的某处。我的 /node_modules/ 文件夹有 885 个子文件夹!我无法深入研究所有这些,试图找出较低级别的符号链接出了什么问题。

但是,如果有人对如何调试符号链接有任何好的提示,我很想了解更多。我会赞成好的答案,因为不存在像 ls -l symlinks 这样易于使用的东西。

就我而言,我在全局安装组织包时遇到了这个问题。

npm ERR! code EEXIST
npm ERR! syscall symlink
npm ERR! path ../lib/node_modules/@{orgname}/{packagename}/bin/index.js
npm ERR! dest /Users/user.name/.nvm/versions/node/v12.22.7/bin/{package_name}
npm ERR! errno -17
npm ERR! EEXIST: file already exists, symlink '../lib/node_modules/@{orgname}/{packagename}/bin/index.js' -> '/Users/user.name/.nvm/versions/node/v12.22.7/bin/packagename'
npm ERR! File exists: /Users/{user.name}/.nvm/versions/node/v12.22.7/bin/{packagename}
npm ERR! Remove the existing file and try again, or run npm
npm ERR! with --force to overwrite files recklessly.

所以根据 npm 的建议,我安装了带有 --force 的软件包并且它有效。

npm install -g @orgname/packagename --force