Visual Studio Code使用NVM指定的节点版本


78

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

我在本地安装了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

相关(和可能的重复):stackoverflow.com/questions/24585261/…–
Gyuri

Answers:


86

在VS Code中,转到您的launch.json文件,并在配置内部添加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"
    }
]}

4
我要问代码如何知道在哪里可以找到此版本,但是显然,此选项是专门为nvm添加的。code.visualstudio.com/docs/nodejs/...
布赖恩·威特

2
launch.json文件在哪里?
Petrus Theron

@PetrusTheron如果您还没有,那么您将创建一个。这里有说明:code.visualstudio.com/docs/editor/debugging#_run-view
Joel Glovier

61

解决方法是设置别名default。在OS终端中运行-

nvm alias default 7.8.0

打开vscode,现在运行node -v返回7.8.0

似乎vscode占用了此(别名默认值)值,而不是由设置的节点版本 nvm use X.X.X

重新启动VS代码以获取更改。

更新(12/04/2018) -此解决方案可能不适用于每个人。请参阅以下答案以了解其他解决方案。


1
这对我也有效,但是应该有一种简便的方法来为VSCode全局指定节点的路径。
JR。

3
这没有用。别名后,nvm use default每次使用新终端时我都必须使用
Ramesh Pareek

也不适合我 也没有使用nvm use default
马特·桑切斯

2
在此之前,我必须删除我的brew安装版本的node。
samlandfried

2
我正在使用WSL运行VS Code。设置默认别名后,必须重新启动VS Code才能获取更改。
约翰·米尔斯,

51

像这样添加runtimeExecutable到您的.vscode/launch.json

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

@Kiong您可以创建新的文件,并复制它的内容
Alongkorn Chetasumon

如何launch.json在项目的根目录中创建文件?
Kiong

1
@Kiong在项目的根目录下创建目录“ .vscode”,然后在其中创建“ launch.json”。
阿贡功塔

39

我遇到了同样的问题,即不仅无法通过VSCode,而且无法通过Atom Editor(使用platformio-ide-terminal软件包在其中管理集成终端)在OS X环境中通过nvm来指定节点版本。以前的答案中的任何建议都对我没有用,除了我不使用调试器,而是对特定任务使用gulp和grunt。显然,至少在这些编辑器中,nvm不会与集成终端或子外壳相处,因为在加载它们时,环境变量$ PATH在内部进行了修改,并且根据此软件包的其中一位撰稿人在本期报道中的评论进行了以下操作此处NVM无法在嵌套shell#1652中加载

@charsleysa,我知道nvm为什么会引发此错误。在您的子shell中,您路径的/ usr / local / bin:/ usr / bin:/ bin:/ usr / sbin:/ sbin部分已经从末尾移出路径的起点。

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

在父外壳程序中,PATH中还没有nvm目录,因此在nvm运行时,它将目录放置在路径之前。但是在子外壳中,macOS重新配置了PATH,以将所有非系统目录放在最后,因此我们遇到了问题。”

启动任何集成终端时,我总是收到以下消息:

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

在我的案例中,我要解决的问题是所报告的同一问题的“替代方法”部分,基本上是以下内容:

  • 通过在我的〜/ .bash_profile顶部的最下面添加以下行来重置路径:PATH =“ / usr / local / bin:$(getconf PATH)”

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

在这里,这是另一种选择,以防万一它没有太大帮助。


2
这应该是公认的答案。我之前曾runtimeVersion在launch.json中设置in,但仅设置了特定任务的节点版本。这适用于整个集成终端实例。谢谢!注意 我必须设置PATH.zshrc
变量

阅读提供的替代链接后-这表明问题出在nvm及其处理子shell的方式上-我将nvm更新为v0.34.0,并且无需重置路径即可解决。
timiscoding

22

我遇到了同样的问题,但是上述答案没有帮助。

显然,默认shellArgs的OSX被设置为bash当我使用zsh。我通过将shellArgs用户设置中的设置为空数组解决了该问题:

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


2
如果which node与cli和vscode不同,这是您的解决方案!🚀
manelescuer

17

我正在使用oh-my-zsh,它也没有使用nvm指定的节点版本。尝试了一些在此处发布的建议,但我设法解决此问题的唯一方法是将以下行添加到~/.zshrc

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

1
我也在使用oh-my-zsh,只有此解决方案对我有用。非常感谢。现在,我不必每次打开VS Code时都更改节点版本。
Rameshwor Maharjan

这也解决了我的vs代码问题。谢谢!
imcc

我遇到了同样的问题,因为在nvm(和vscode插件)已经安装并运行之后,macos切换到了zsh。顺便说一句,我不得不重新启动VSCode(而不仅仅是重新加载)以刷新环境。
tutuDajuju

这是唯一为我工作的人。谢谢!
拉斐尔·罗松

12

我发现的另一种解决方案是在使用nvm选择节点后,仅从外壳中启动代码。

您需要首先打开命令托盘,然后选择“将'code'安装到路径中”。

在此处输入图片说明

然后启动一个终端,并通过nvm选择您的节点,然后启动“代码”。

在此处输入图片说明


我使用了它,发现如果您转到VScode工具栏并调出“关于”页面,它仍然显示旧版本,但是如果我使用命令行,它将告诉我它指向了升级版,因此可以正常工作。
哈维·林

这需要关闭VSCode并从命令行重新启动它才能有效地工作。
华莱士·西德瑞

8

提供的一些答案是正确的,但有些不完整。此过程对我有用:

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

奖励:如果您始终想在VS Code的终端上获取特定的节点版本,请通过VS Code外部打开终端窗口并运行来将其设置为默认版本:

nvm alias default v12.14.0

4

我尝试了所有建议的解决方案,但没有任何效果。

/ usr / local / bin / node指向某个地方。我建立了到特定nvm节点文件夹的符号链接,这为我解决了这个问题:

ln -s /Users/mad/.nvm/versions/node/v11.1.0/bin/node /usr/local/bin/node

4

特别是对于外壳,我没有任何问题,但是您可以:

我对vscode本身有疑问,没有解决方案可以帮助我。因此,我完成了以下启动脚本的使用。

    {
        "type": "node",
        "request": "launch",
        "name": "Launch Program",
        "program": "${workspaceFolder}/server.js",
        "runtimeExecutable": "/bin/bash",
        "runtimeArgs": ["-c", ". ~/.nvm/nvm.sh;nvm run default \"$@\"", "dummy"]
    },

这假设您已将其配置为bash(否则将其更改为Shell),并且您要使用defaultnvm所配置的节点版本(也可以对其进行更改)。

注意:“ dummy”参数是必需的,因此可以正确解析其余参数。

关于“虚拟”的更详细的解释:Shell脚本使用位置参数,其中第一个将是脚本位置本身(由寻址$0),当使用-c标志就地读取脚本时,则不会$0设置。vscode将传递一些参数,例如节点启动脚本的位置将被错误地解释,因此“虚拟”将所有参数推送到一个位置。它可以是任何东西,但必须存在。


4

我遇到了同样的问题,并且发现了一个奇怪的解决方法,该解决方法将来可能会对其他人有所帮助。

如果未设置,则eslint.runtime系统正在运行v10.11.0eslint服务器的节点,而我希望它运行v12.13.0已安装并通过设置为默认值的节点nvm

我发现节点的v10版本是brew根据@franziga的回答安装的,而我所需的节点版本是由安装的nvm。因此,我v10.11.0通过brew卸载并关闭/重新打开VS Code。奇怪的是,eslint仍在报告它已开始使用v10。

我尝试在没有任何PATH启动脚本的情况下对我的shell进行任何更改,并且节点的版本仍按预期正确指向v12,但是VS代码仍然为eslint启动了v10。

我不确定如何检查eslint正在运行的可执行文件的路径,如果我打开集成终端,则可以在节点(v12)的预期版本中正常运行。

解决方案(对我而言):

我发现如果"eslint.runtime": "node"settings.json其中进行设置,那么在终端上node使用vscode打开时,它将使用激活的任何版本code .。只是"node"-没有路。


1
这个解决方案对我最好。我也不需要从终端打开代码。
Matt Scheurich

2

我有同样的问题,并且发现我已经node通过brew和安装了nvm。我卸载node了by,brew并且终端和Visual Studio代码上的版本现在都相同。


2

您无需修改​​默认节点版本。以下示例假定节点6是您的默认版本,并且您希望VSCode引用节点的版本7:

# open a terminal instance
nvm use 7
code . # or project folder instead of "."
# when VSCode start, you may use ctrl+` to open the integrated terminal
# then check the node version in the integrated terminal
node -v # should print 7

0

并没有尝试所有解决方案,但是对我来说,更新nvm很简单。

只需按照此处的安装进行操作并确保您bash_profile已更新。


0

因此,您的nvm配置良好,但是其他版本的节点STILL仍在接管吗?

删除节点的所有非nvm版本:

  1. brew uninstall --force node (没有系统节点,纱线会很好)
  2. 通过pkg或其他非nvm方法安装的其他版本
  3. 重新登录。现在,无论shell是如何启动的,使用nvm都无法争夺路径。

注意:安装/升级纱线时,请使用 brew install yarn --without-node


对于Pete的热爱,无需使用brew来安装节点。它具有本地安装程序! nodejs.org/en/download
jnovack

@jnovack我的答案包括卸载节点的brew-installed版本。请重新阅读。此外,brew对于不需要的人来说,使用install节点非常好,nvm并且比本机安装程序具有优势。
Stepan

0

没有其他解决方案对我有用。

所以我跑了nvm alias default node,这为我解决了。


当心:nvm alias default node设置已安装的节点的“当前”版本,而不是所需的特定版本。
jnovack
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.