nvm与npm配置中的"prefix"选项不兼容。

305

我正在尝试使用nvm运行另一个NodeJS版本,但出现了以下错误:

$ nvm use v4.2.4

nvm is not compatible with the npm config "prefix" option: 
   currently set to "/Users/z/.npm-global"
Run `npm config delete prefix` or `nvm use --delete-prefix v4.2.4` to unset it.

我故意设置了前缀以避免使用sudo npm(请参见https://docs.npmjs.com/getting-started/fixing-npm-permissions)。

是否有任何方法可以在使用nvm的情况下保留全局安装包的前缀?


1
我使用 npm config delete prefix 来解决这个问题,目前还没有任何问题。 - ggdx
1
@DanWhite 如果我删除前缀,就会失去将全局安装转移到专用目录的功能。 - Dmitri Zaitsev
13
那就是重点。使用nvm后,它而不是你来管理全局安装。另外,全局安装不应该在不同的Node版本间共享。 - LJHarb
3
每个 Node 的副本都带有自己的 npm,它确定了自己的设置。 - LJHarb
1
确实,使用nvm选择的每个节点版本都是针对每个shell的 - 这是设计上的考虑。 - LJHarb
显示剩余6条评论
23个回答

534

删除并重置前缀

$ npm config delete prefix 
$ npm config set prefix $NVM_DIR/versions/node/v6.11.1

注意:使用错误信息中指定的版本号替换版本号。

nvm与npm配置选项“prefix”不兼容:当前设置为“/usr/local”。运行“npm config delete prefix”或“nvm use --delete-prefix v6.11.1 --silent”取消设置。


感谢Github上的@gabfiocchi - “您需要覆盖nvm前缀”


17
这个方法非常有效!只需要获取我的Node版本即可。 - Sirius_B
1
我似乎有一个符号链接 /usr/local/bin/node,这会导致 vscode 中的集成终端看到一个它不应该看到的 node 版本。按照上面的步骤,然后删除符号链接似乎已经解决了这个问题。现在我的 node 和 npm 由 nvm 管理。 - Sudhanshu Mishra
13
这只在当前窗口有效。如果你打开一个新的终端或者新窗口,你需要重新做一遍。 - jtiscione
只需删除它即可。但是,如果设置了,应该将其设置为$NVM_DIR/current - Scott Nedderman
7
我会尽力进行翻译,以下是翻译内容: 我必须按照以下顺序进行操作:
  1. 运行命令 "nvm use --delete-prefix vx.x.x --silent"
  2. 运行命令 "npm config delete prefix"
  3. 运行命令 "npm config set prefix $NVM_DIR/versions/node/vx.x.x"
- Guangtong Shen
显示剩余11条评论

82

我也遇到了同样的问题,执行npm config delete prefix没有帮助。

不过这个方法可以:

使用brew安装nvm后,创建~/.nvm目录:
$ mkdir ~/.nvm

并将以下内容添加到~/.bash_profile文件中:

export NVM_DIR=~/.nvm
. $(brew --prefix nvm)/nvm.sh

检查您的任何 ~/.bashrc~/.profile~/.bash_profile 文件中是否有其他与 nvm 相关的命令。

打开一个新终端,这次不应出现任何警告消息。通过执行nvm --version 命令来检查 nvm 是否正常工作。
之后,使用nvm install node && nvm alias default node安装/重新安装 NodeJS。

更多信息

我使用 homebrew 安装了 nvm,之后我收到了以下通知:

请注意,nvm 的上游要求我们明确指出通过 Homebrew 管理 nvm 不受其支持,您应在报告之前检查任何问题是否符合标准的 nvm 安装方法。

如果不存在,您应该创建 NVM 的工作目录:

 mkdir ~/.nvm
将以下内容添加到~/.bash_profile或您所需的shell配置文件中:
 export NVM_DIR=~/.nvm
 . $(brew --prefix nvm)/nvm.sh

你可以将$NVM_DIR设置为任何位置,但如果不更改自/usr/local/Cellar/nvm/0.31.0以来,则会在升级/重新安装时销毁任何已安装的nvm Node安装。

忽略它会导致出现以下错误消息:

nvmnpm config“prefix”选项不兼容:目前设置为"/usr/local/Cellar/nvm/0.31.0/versions/node/v5.7.1"
运行nvm use --delete-prefix v5.7.1 --silent以取消设置。

我按照早期指南(来自homebrew/nvm)操作后,发现需要重新安装NodeJS。于是我这样做了:

nvm install node && nvm alias default node

并且它已经被修复了。

更新: 使用brew安装NVM会导致终端启动缓慢。您可以按照这个指南来解决问题。


10
在我这种情况下,“nvm alias default node”似乎对我有帮助。 - mirkobrankovic
37
如果通过 brew 安装,nvm 不受支持,请卸载它并使用正确的方法,即在 readme 中提到的 curl 脚本。 - LJHarb
3
我使用了 curl 脚本来安装 nvm,但这个答案对我不起作用。 - intcreator
1
@intcreator 谢谢。最终我按照这篇指南进行了全新的nvm安装:https://www.nearform.com/blog/how-to-manage-node-js-sudo-free-with-nvm/ 我之前使用homebrew安装过,但它已不再受支持。这留下了很多残留物需要清理,然后我还得运行rm -rf node_modules并再次运行npm install,因为目录已经存在权限问题。 - Jake T.
1
为了后人的清晰度,我不得不执行 brew remove node -f 命令,这将删除所有已安装的版本。首先执行此操作,然后按照我上面提供的链接中的指南进行操作,然后删除 node_modules。您应该会得到一个干净的安装!我认为您还需要安装 npm,我刚刚按照 nodejs.org 上的一篇文章中的说明进行了操作。npm install npm@latest -g 是命令,在安装 node 后执行即可。 - Jake T.
显示剩余7条评论

40

如果您之前是以其他方式安装 Node,可能会与本地安装的 Node 冲突。您应该删除此实例:

  1. 删除 node_modules sudo rm -rf /usr/local/lib/node_modules
  2. 删除 node sudo rm /usr/local/bin/node
  3. 删除 node 链接 cd /usr/local/bin && ls -l | grep "../lib/node_modules/" | awk '{print $9}'| xargs rm

操作完成后,您可以安装 nvm。


10
你是否愿意在你的代码回答中添加一些解释?注释不足够,因为你的命令行比它们解释的要复杂。详细说明你的回答细节如何解决问题。将你的回答与几年前的回答进行对比。什么使你的回答对这个问题有附加价值? 您是否希望在您的代码回答中添加一些解释?由于您的命令行比注释所解释的更加复杂,因此注释并不足够。请详细阐述您的回答是如何解决问题的,并将其与多年前的回答进行对比。您的回答有何附加价值? - Yunnosch
对我来说,空的第一行代码(你最近添加的)需要有它自己的解释... - Yunnosch
在 StackOverflow 上待了五个月后,考虑参加非常有启发性的 [导览]。 - Yunnosch
尽管这段代码片段可能解决了问题,但包括解释真的有助于提高您文章的质量。请记住,您是为未来的读者回答问题,而这些人可能不知道您代码建议的原因。另外,请尽量避免在代码中添加过多的解释性注释,这会降低代码和解释的可读性! - Filnor
1
如果你无法安装nvm,那么我的目标是使用nvm,我不应该这样做吗? - Jake T.
显示剩余2条评论

37

当您的NVM安装文件夹路径具有符号链接时,可能会出现此错误。

说明

NVM的默认安装路径是:$HOME/.nvm,但您的主文件夹可能是另一个驱动器的符号链接,就像我的情况一样。

例如,我的主文件夹是指向另一个驱动器的符号链接:

/home/myuser -> /bigdrive/myuser

这将导致前缀问题。

解决方案

在您的启动脚本(.bashrc或.zshrc或其他)中,将NVM文件夹更改为直接路径。

例如:NVM_DIR="/bigdrive/myuser/.nvm"

.bashrc

export NVM_DIR="/bigdrive/myuser/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

谢谢!你的回答应该有更多的可见性。 - ben
1
不行。我已经把我的大脑烧坏了,都无法理解这个错误有多疯狂。我没有找到任何帖子能够帮助我。我不得不奋力解决这个问题。我很高兴能够帮助你。请投票支持我的答案,让它更易被发现。 - André Avelar
我的 echod $NVM_DIR 是 "/Users/vijayshanker/.nvm",我应该在 bashrc 中放置 "export NVM_DIR="/Users/vijayshanker/.nvm(和其余部分)" 吗?我尝试过了,但仍然没有解决问题,已经苦苦挣扎了6个小时,请帮忙。注意:我没有安装 npm,我没有从 npm 安装我的 node。 - vijay shanker
1
一种解决方案可能是在.bashrc或命令行中导出NVM_DIR=$(readlink -f "$HOME/.nvm")。这将从$HOME/.nvm中删除所有符号链接,并导出一个只包含真实目录的纯全路径。 - Nimlar
export HOME="/big/drive/myuser" 这样更加健壮。不过针对您的情况,我建议使用 fstab 进行绑定挂载。如果这种方法再出现问题,我可能会采用那种方式。 - Ray Foss

13

使用通过nvm安装的node时,我遇到了这个问题,而nvm是通过homebrew安装的。我通过运行brew uninstall nvmrm -rf $NVM_DIR然后重新使用官方安装脚本安装nvm并重新安装所需的node版本来解决了这个问题。

注意:我还将$NVM_DIR进行了挂载和符号链接。我将其移回到了我的主目录中。


10

如果您的主目录挂载在某个位置,那么这可能是问题所在,因为nvm无法正确处理符号链接。因为我不关心$NVM_DIR位于何处,所以我运行了以下命令,一切正常:

$ mv ~/.nvm /tmp/
$ export NVM_DIR="/tmp/.nvm"
$ nvm use --delete-prefix v6.9.1

7

enter image description here我曾遇到同样的问题,每次使用终端时都感到很烦。我在终端中运行了命令,问题就解决了。

对于那些想从brew中删除nvm的人来说:

仅仅运行 brew uninstall nvm 可能不足够

如果你发现npm的前缀仍然是 /usr/local ,请运行下面这个命令:

sudo rm -rf /usr/local/{lib/node{,/.npm,_modules},bin,share/man}/{npm*,node*,man1/node*}


7

我遇到了相同的错误信息,但使用了另一种解决方案。 curl(install.sh)生成的路径不匹配。 请用以下方式检查:

echo $NVM_DIR

在我的情况下,路径为:/var/www//.nvm。请在您自动生成的bash文件中显示并更改它,并替换它:(~/.bash_profile、~/.zshrc、~/.profile或~/.bashrc)。
替换
export NVM_DIR="$HOME/.nvm"

使用(例如)

export NVM_DIR="$HOME.nvm"

1
来这里发表同样的评论 :) 在我的情况下,是因为当我创建用户时,我将主目录设置为useradd --home /home/user/,其中包含尾随的/。我从/etc/passwd文件中删除了它,一切又开始正常工作了。 - Israel

5

只有两个命令可以解决这个问题。有些用户打开终端时也可能立即收到此错误。他们看到的第一件事是这个错误:

nvm is not compatible with the npm config "prefix" option: 
currently set to "/Users/z/.npm-global"

运行 npm config delete prefix 或者 nvm use --delete-prefix v4.2.4 命令来取消设置。

为了解决这个问题,请运行以下两个命令。 注意:将版本号改成错误信息中显示的相同版本号。

$ npm config delete prefix 
$ npm config set prefix $NVM_DIR/versions/node/v6.11.1

注意:如果您的终端正在使用zsh,则此方法也适用。

3

我解决了这个问题,当它在VSCode和JetBrains终端上显示时,但在本地终端中却没有使用以下命令:

ls -la /usr/local/bin | grep "np[mx]"

这将为您提供最终解决方案的路径:
... npm -> ../lib/node_modules/npm/bin/npm-cli.js
... npx -> ../lib/node_modules/npm/bin/npx-cli.js

在那里,删除文件并重新启动VS Code应该可以解决这个问题:

rm -R /usr/local/bin/npm /usr/local/lib/node_modules/npm/bin/npm-cli.js
rm -R /usr/local/bin/npx /usr/local/lib/node_modules/npm/bin/npx-cli.js

修复链接:https://github.com/nvm-sh/nvm/issues/1690#issuecomment-392014774


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接