如何修复现有文件和符号链接之间的 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 list
或 npm 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,所以我安装了 phantomjs
和 phantomjs-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
我 运行遇到 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 list
或 npm 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,所以我安装了 phantomjs
和 phantomjs-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