使用 Visual Studio Code,让其使用由 NVM 指定的 Node 版本

199

VS Code是否可以使用NVM指定的Node版本?

我已经在本地安装了6.9.2版本。即使从OS X终端(而非VS Code终端)切换到另一个版本,重新启动VS Code,VS Code仍然显示使用6.9.2。

OS X终端

MacBook-Pro-3:~ mac$ node -v
v7.8.0

VS Code 终端

MacBook-Pro-3:QB-Invoice-API mac$ node -v
v6.9.2

相关(可能有重复):https://dev59.com/Q2Af5IYBdhLWcg3wey3Z - Gyuri
34个回答

181

解决方法是设置别名为default。在操作系统终端中运行 -

nvm alias default 7.8.0

打开VS Code,现在运行node -v,将返回7.8.0

看起来VS Code使用了这个(别名默认)值而不是通过nvm use X.X.X设置的节点版本。

重新启动VS Code以使其拾取更改。


16
无效。在创建别名后,每次打开新终端时,我需要使用“nvm use default”命令。 - Ramesh Pareek
3
在此之前,我需要移除我使用 brew 安装的 Node 版本才能使其工作。 - samlandfried
4
我正在使用WSL运行VS Code。在设置默认别名之后,需要重新启动VS Code才能使其生效。 - John Mills
3
如果这对您不起作用,请确保在 VS Code 重新启动后创建新的终端。如果 VS Code 恢复了您之前的控制台上下文,则不会选择新的默认节点版本。 - FINDarkside
1
对我来说有效,最简单的解决方案。 - Kaushal Pahwani
显示剩余9条评论

180

在VS Code中:

  • 打开你的launch.json文件
  • 像下面展示的那样,在configurations内添加runtimeVersion属性

在这个例子中,我们假设已经使用nvm安装了4.8.7:

{
"version": "<some-version>",
"configurations": [
    {
        "type": "node",
        "runtimeVersion": "4.8.7", // If i need to run node 4.8.7
        "request": "launch",
        "name": "Launch",
        "program": "${workspaceFolder}/sample.js"
    }
]}

10
我原本想问Code是如何知道在哪里找到这个版本的,但显然,这个选项是专门为nvm添加的。https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_multi-version-support - Brian Witt
7
launch.json 文件在哪里? - Petrus Theron
2
@PetrusTheron 如果你还没有,你需要创建一个。这里有说明:https://code.visualstudio.com/docs/editor/debugging#_run-view - Joel Glovier
7
将"runtimeVersion"设置为"default"解决了我的问题。 - Nnanyielugo
通过在我的settings.json中添加“launch”配置并将runtimeVersion设置为“default”,这对我起作用了: “launch”:{“configurations”:[ { “type”:“node”, “runtimeVersion”:“default”, “request”:“launch”, “name”:“Launch” } ], } - sazzledazzle
显示剩余5条评论

73

在您的 .vscode/launch.json 文件中添加 runtimeExecutable,如下所示:

{
  "type": "node",
  "request": "launch",
  "name": "App",
  "program": "${workspaceRoot}/index.js",
  "runtimeExecutable": "${env:HOME}/.nvm/versions/node/v6.9.2/bin/node"
}

@Kiong 你可以创建一个新文件,并将上面的内容复制到其中。 - Alongkorn
1
我应该在项目根目录下创建launch.json文件吗? - Kiong
1
@Kiong 在你的项目根目录下创建一个名为“.vscode”的文件夹,然后在其中创建“launch.json”文件。 - Alongkorn
1
像这样吗? "runtimeExecutable": [ { "type": "node", "request": "launch", "name": "App", "program": "${workspaceRoot}/index.js", "runtimeExecutable": "${env:HOME}/.nvm/versions/node/v14.15.4/bin/node" } - Nikolay Advolodkin

47

有些答案是正确的,并且已经得到了赞同,但有些不完整。以下过程对我来说有效:

  1. VS Code内部打开终端窗口并运行node -v。例如,您会得到v10.12.0
  2. VS Code外部打开终端窗口,使用nvm更改您的node版本(例如,nvm use v12.14.0
  3. Cmd+Shift+p,选择首选项>打开设置(JSON)
  4. "terminal.integrated.shellArgs.osx": []添加到您的用户配置中
  5. Cmd+Shift+p,选择Shell Command:在PATH中安装'code'命令
  6. 关闭VS Code
  7. 打开终端窗口并运行code。这将使用新的和更新的bash/zsh会话打开VS Code
  8. VS Code内部打开终端窗口并运行node -v。您将得到v12.14.0

奖励:如果您想要在VS Code的终端上始终获得特定的node版本,请通过在VS Code外部打开终端窗口并运行以下命令将其设置为默认值:

nvm alias default v12.14.0

1
这对我没用。当 nvm 版本为 14.16 时,仍设置为 12.19,下一步将尝试 nvm 默认方法。 - secondman
1
非常感谢!小建议。设置属性已被弃用。在我的情况下,这个方法可行: "terminal.integrated.defaultProfile.osx": "zsh" - Sanchitos
这是我的解决方案,带有Sanchito的更新。非常感谢你。 - undefined

44

我在我的OS X环境中使用nvm指定node版本时,不仅在VSCode中遇到了同样的问题,而且在Atom编辑器中也遇到了这个问题(使用platformio-ide-terminal包来管理集成终端)。除了我没有使用调试器而是使用gulp和grunt执行特定任务之外,先前答案中的建议都对我无效。显然,在这些编辑器中,nvm与集成终端或子shell不兼容,因为在加载它们时,环境变量$PATH在内部被修改,并根据此包的一个贡献者在此问题报告NVM fails to load within nested shell #1652中的评论所述,会发生以下情况:

"@charsleysa我知道为什么nvm会抛出这个错误。在你的子shell中,一些路径已经从PATH的末尾移动到了开头。

  • 然后,当nvm启动时,它调用nvm_change_path(我的贡献将其从nvm_prepend_path更改为此),并直接修改nvm相关部分的路径。
  • 然后,Nvm通过询问npm当前的前缀来检查它是什么。由于/usr/local/bin/npm现在具有优先级,它报告/usr/local/bin。
  • Nvm然后检查npm报告的当前前缀是否在当前nvm节点版本的目录树中(此阶段,是默认nvm别名解析到的节点版本的安装目录)。
  • 前缀不是该树的一部分,因此它会停用自身(在此过程中调用nvm_strip_path,这就是为什么子shell的路径中没有nvm相关路径的原因),并以您收到的错误终止。
  • macOS的/etc/profile(或/etc/zprofile)调用/usr/libexec/path_helper,这样做PATH switcheroo。

在父Shell中,PATH还没有nvm dir,因此当nvm运行时,它将其目录添加到路径中。但是在子Shell中,PATH已被macOS重新配置为将任何非系统目录放在最后,这就是我们遇到问题的原因。

每次启动任何集成终端时,我总是收到此消息:

nvm 与 npm 配置项 "prefix" 不兼容: 当前设置为 "/usr/local" 运行 npm config delete prefixnvm use --delete-prefix vx.x.x --silent 取消设置。

在我的情况下,我采用了同样问题报告中的“解决方法”部分,即通过在任何其他内容之前在我的~/.bash_profile 中添加以下行来重置路径:

PATH="/usr/local/bin:$(getconf PATH)"

之后,当我在两个编辑器上启动任何集成终端时,就不会再出现警告了,我可以与 nvm 交互,轻松地切换任何节点版本,而且完全没有问题。

这里还有另一种选择,以防这个方法不太有效。


3
这应该是被采纳的答案。我之前在launch.json中设置了“runtimeVersion”,但那只是为特定任务设置了节点版本。这个方法适用于整个集成终端实例。谢谢!注意:由于我正在使用zsh,所以我必须在“.zshrc”中设置PATH变量才能使其正常工作。 - timiscoding
阅读提供的备用链接后,该链接建议问题出在nvm及其处理子shell的方式上。我将nvm更新到v0.34.0版本,这样就不需要重置路径来解决问题了。 - timiscoding

30

我正在使用oh-my-zsh,但它没有使用nvm指定的Node版本。尝试了这里发布的几个建议,但我解决这个问题的唯一方法是在~/.zshrc的顶部添加以下行:

PATH="/usr/local/bin:$(getconf PATH)"

3
我也使用oh-my-zsh,只有这个解决方案对我有效。非常感谢你。现在我不必每次打开VS Code时都更改Node版本了。 - Rameshwor Maharjan
3
我有同样的问题,因为在安装和使用 nvm(和 vscode 插件)之后,macOS 切换到了 zsh。顺便说一下,我不得不重新启动 VSCode(而不仅仅是重新加载)来刷新环境。 - tutuDajuju
2
这是唯一一个对我有效的。谢谢! - Rafael Rozon
1
使用命名别名作为解决方法在这个问题上起到了临时的效果,但实际上只有这个方法解决了我的问题。 - Mugshep
1
同样,这是唯一对我起作用的东西。 - mijota

27

我曾经遇到过相同的问题,但以上的回答都没有帮助。

显然,osx 的默认 shellArgs 设置为 bash,而我使用的是 zsh。通过在我的用户设置中将 shellArgs 设置为空数组,我成功解决了这个问题:

"terminal.integrated.shellArgs.osx": []


2
如果 which node 与 cli 不同且与 vscode 不同,那么这就是您的解决方案! - manelescuer

22

我发现的另一个解决方案是,在使用 nvm 选择节点后,直接从 shell 启动 code。

你需要首先打开命令面板并选择“将 'code' 安装到路径中”。

输入图像描述

然后启动终端并通过 nvm 选择你的节点,再启动“code”。

输入图像描述


我使用了这个,发现如果你去VScode工具栏并打开“关于”页面,它仍然显示旧版本,但如果我使用命令行,它会告诉我指向升级版本,所以它有点起作用。 - Harvey Lin
这需要关闭VSCode并从命令行重新启动它才能有效地工作。 - Wallace Sidhrée
2
接受的答案没帮助,但之后在 VSC 中运行 nvm use default 命令解决了问题。谢谢! - Richard Morgan
我的问题只是要使用项目nvmrc中指定的确切版本启动VS Code。同时,我不想更改默认的nvm版本,因为我只需要一个单独的节点版本用于一个项目。通过npm use直接从项目目录打开VSCode解决了我的问题。非常感谢! - Igor Skobelev

21

这里有很多复杂的答案。在我的情况下,这是由于之前安装了Node引起的。通过删除以下目录来解决:

rm -rf /usr/local/bin/npm
rm -rf /usr/local/bin/node

在 VS Code 中运行 nvm use default 命令,以使用 nvm 安装的 Node 版本。

肯定是对我也起作用的解决方案,假设您已经正确安装了nvm。 - aragalie
对我来说很有效,迄今为止最简单的解决方法,应该被接受。 - Timothy
这对我有用,在关闭并重新打开VS Code后。谢谢! - undefined

11

我遇到了同样的问题,但我找到了一种奇怪的解决方法,可能会对以后的某个人有所帮助。

如果我不设置eslint.runtime,则我的系统将在运行ESLint服务器时使用Node v10.11.0,而我想要它使用我通过nvm安装并设置为默认版本的v12.13.0

我发现用brew安装的是Node的v10版本,这是基于@franziga的答案,但我想要的版本是通过nvm安装的。因此,我通过brew卸载了v10.11.0,然后关闭/重新打开了VS Code。奇怪的是,ESLint仍然报告它是使用v10启动的。

我尝试在没有更改任何启动脚本中的PATH的情况下运行shell,预期的Node版本仍然正确地指向了v12,但是VS Code仍然会为ESLint启动v10。

我不确定如何检查由ESLint运行的可执行文件的路径,如果我打开终端,一切都可以正常工作,并且使用预期的Node版本(v12)。

解决方案(适用于我):

我发现如果我在settings.json中设置"eslint.runtime": "node",它将使用我在终端上使用code .打开VS Code时处于活动状态的node版本。只需"node" - 没有路径。


1
这个解决方案对我帮助最大。我也不需要从终端打开代码。 - Matt Scheurich
1
这个解决方案在Windows上也很有效,因为设置运行时参数似乎会使eslint查看系统路径变量以解析node二进制文件,而不是使用内置于vscode中的版本。 - nextgentech
1
这太难找了,难以置信。 - Eugene
有点失望的是,eslint 扩展默认情况下并不使用它在路径中找到的 node - Marc

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