ChatGPT解决这个技术问题 Extra ChatGPT

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

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 代码终端

MacBook-Pro-3:QB-Invoice-API mac$ node -v
v6.9.2
相关(和可能的重复):stackoverflow.com/questions/24585261/…

T
Tjaart van der Walt

在 VS 代码中:

转到您的 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"
    }
]}

我本来想问 Code 是如何知道在哪里可以找到这个版本的,但显然,这个选项是专门为 nvm 添加的。 code.visualstudio.com/docs/nodejs/…
launch.json 文件在哪里?
@PetrusTheron 如果您还没有,您将创建一个。这里有说明:code.visualstudio.com/docs/editor/debugging#_run-view
将“runtimeVersion”设置为“default”解决了我的问题。
这看起来很有希望,但对我不起作用。可能需要更新 nvm,我不知道。
A
A G

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

nvm alias default 7.8.0

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

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

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

更新 (12/04/2018) - 此解决方案可能不适用于所有人。请参阅下面的答案以获取其他解决方案。


这对我也有用,但是应该有一种简单的方法可以为 VSCode 全局指定节点的路径。
这没有用。别名后,我每次使用新终端时都必须使用 nvm use default
在此之前,我必须删除我的 brew 安装版本的节点。
我正在使用 WSL 运行 VS Code。设置默认别名后,需要重新启动 VS Code 以获取更改。
如果这对您不起作用,请确保您在 VS Code 重新启动后创建新终端。如果 VS Code 恢复您之前的控制台上下文,它不会选择新的默认节点版本。
A
Alongkorn

像这样将 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您可以创建新文件并将上面的内容复制到其中
在我的项目的根目录中创建 launch.json 文件?
@Kiong 在项目的根目录创建目录“.vscode”,然后在其中创建“launch.json”。
像这样? “runtimeExecutable”:[ { “type”:“node”,“request”:“launch”,“name”:“App”,“program”:“${workspaceRoot}/index.js”,“runtimeExecutable”:“ ${env:HOME}/.nvm/versions/node/v14.15.4/bin/node" }
C
Charlyboy

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

" @charsleysa 我知道为什么 nvm 会抛出这个错误。在你的 subshell 中,不知何故你的 PATH 的 /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin 部分已经从最后移动了从 PATH 到开始。当 nvm 启动时,它调用 nvm_change_path (我的贡献将它从 nvm_prepend_path 更改为这个),它修改了路径中与 nvm 相关的部分。然后,nvm 通过询问 npm 检查当前的 npm 前缀它是什么。由于 /usr/local/bin/npm 现在有优先级,它会报告 /usr/local/bin。nvm 然后检查 npm 报告的当前前缀是否在当前 nvm 节点版本的目录树中(在此阶段,您的默认 nvm 别名解析为的节点版本的安装目录。前缀不是该树的一部分,因此它会自行停用(在此过程中调用 nvm_strip_path,这就是为什么在您的子 shell 中没有与 nvm 相关的路径的原因PATH),并因您遇到的错误而放弃。macOS 的 /etc/profile(或 /etc/zprofile)调用 /usr/libexec/path _helper,它执行 PATH 切换。在父 shell 中,PATH 中还没有 nvm 目录,因此在 nvm 运行时,它会将其目录添加到路径中。但是在 subshell 中,PATH 已被 macOS 重新配置,以将任何非系统目录放在最后,我们遇到了问题。”

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

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

在我的情况下,我为解决这个问题所做的是报告的同一问题的“解决方法”部分,基本上如下:

通过在最顶部的 ~/.bash_profile 中添加以下行来重置路径:PATH="/usr/local/bin:$(getconf PATH)"

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

这是 another 替代方案,以防万一这个没有太大帮助。


这应该是公认的答案。我之前在launch.json 中设置了runtimeVersion,但这只设置了特定任务的节点版本。这适用于整个集成终端实例。谢谢!注意。我必须在 .zshrc 中设置 PATH var,因为我正在使用 zsh 让它工作
在阅读了提供的替代链接后 - 这表明问题出在 nvm 及其处理子外壳的方式上 - 我将 nvm 更新到 v0.34.0 并且它可以在没有重置路径解决方法的情况下工作。
W
Wallace Sidhrée

提供的一些答案是正确的和赞成的,但有些不完整。这个程序对我有用:

在 VS Code 中打开终端窗口并运行 node -v。例如,您将获得 v10.12.0。在 VS Code 外部打开终端窗口 使用 nvm 更改您的节点版本(即 nvm 使用 v12.14.0) Cmd+ Shift + p 并选择 Preferences > Open Settings (JSON) Add "terminal.integrated.shellArgs.osx": [] to your用户配置 Cmd+ Shift + p 并选择 Shell Command: Install 'code' command in PATH Close VS Code。打开终端窗口并运行代码。这将使用新的和更新的 bash / zsh 会话打开 VS Code。在 VS Code 中打开终端窗口并运行 node -v。您将获得 v12.14.0。

奖励:如果您总是想在 VS Code 的终端上获取特定的节点版本,请将其设置为默认值,方法是在 VS Code 外部打开一个终端窗口并运行:

nvm alias default v12.14.0

这对我不起作用。当 nvm 版本为 14.16 时仍设置为 12.19,接下来将尝试 nvm 默认方法。
太感谢了!小建议。设置属性已弃用。在我的情况下,这有效:“terminal.integrated.defaultProfile.osx”:“zsh”
S
Skeevs

我有同样的问题,但上面的答案没有帮助。

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

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


如果 which node 不同于 cli 而不是 vscode,这就是您的解决方案! 🚀
B
BlueTabasco

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

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

我也在使用 oh-my-zsh,只有这个解决方案对我有用。太感谢了。现在我不必每次打开 VS Code 时都更改节点版本。
我遇到了同样的问题,因为在 nvm(和 vscode 插件)已经安装并工作之后,macos 切换到了 zsh。顺便说一句,我不得不重新启动 VSCode(不仅仅是重新加载)来刷新环境。
这是唯一对我有用的。谢谢!
使用命名别名是解决此问题的一种方法,但这是唯一真正为我解决问题的方法。
j
jr.

我发现的另一种解决方案是在使用 nvm 选择节点后简单地从 shell 启动代码。

您需要首先打开命令托盘并选择“将'代码'安装到路径中”。

https://i.stack.imgur.com/ryxlm.png

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

https://i.stack.imgur.com/Qhh7s.png


我用这个,发现如果你去VScode工具栏并调出'关于'页面,它仍然显示旧版本,但如果我使用命令行,它会告诉我它指向升级版,所以它有点工作。
这需要关闭 VSCode 并从命令行重新启动它才能有效工作。
接受的答案没有帮助,但后来在 VSC 中运行 nvm use default 有帮助。谢谢!
所以我的问题只是用项目的 nvmrc 中指定的版本启动 VS 代码。同时我不想更改默认的 nvm 版本,因为我只需要一个单独的节点版本用于一个项目。使用 npm use 直接从项目目录打开 VSCode 解决了我的问题。十分感谢!
r
richardm

这里有很多复杂的答案。就我而言,这是由于先前已安装节点造成的。通过删除以下目录来修复它:rm -rf /usr/local/bin/npmrm -rf /usr/local/bin/node,然后在 VSC 中运行 nvm use default 以获取 nvm 安装的节点版本。


绝对是对我有用的解决方案,假设您已经正确安装了 nvm。
M
Monkpit

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

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

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

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

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

解决方案(对我来说):

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


这个解决方案对我帮助最大。我也不需要从终端打开代码。
这个解决方案在 Windows 上也很有效,因为设置运行时参数似乎让 eslint 查看系统路径变量来解析节点二进制文件,而不是使用 vscode 包含的内部版本。
e
estani

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

检查您的外壳是否正确配置或更改(您可能正在为 vscode 或终端使用不同的外壳)

检查您的环境,如果设置不正确,请使用 terminal.integrated.env.

我遇到了 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)并且您希望使用 nvm 配置的 default 节点版本(您也可以更改它)。

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

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


m
madflanderz

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

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

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

它正在工作,但是在使用“nvm use”后如何自动化这个过程?
F
Franz Wong

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


M
Mateja Petrovic

您无需修改默认节点版本。以下示例假定节点 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

C
Craig Hicks

我发现在调用代码之前在子shell中本地设置节点版本效果很好,同时不更改当前shell中的版本,例如

$ (nvm use 14; code .)

因此,要使其对任何项目文件夹透明地工作,请在项目文件夹中创建一个文件 .precode,并在开始代码之前使用 shell 命令获取源代码 - 例如,

nvm use 14

然后添加到 ~/.bashrc

pre_code(){
    if [ $# == 1 ] &&  [ -f ${1}/.precode ] ; then
        echo "(source ${1}/.precode ;  `which code` ${@})"
        (source ${1}/.precode ; `which code` ${@})
    else
        `which code` ${@}
    fi
}   
alias code='pre_code'

(注意:在编辑之前打开的任何 shell 中运行 source ~/.bashrc 以使编辑生效。)

然后,假设必要的文件 ~/myproject/.precode 存在,开始代码

$ code ~/myproject

将在外壳上产生一些诊断输出,例如

source github/myproject/.precode
Now using node v14.15.1 (npm v6.14.8)

以及在终端窗口和调试器中启动具有正确节点版本的新 vscode 窗口。但是,在启动它的 shell 中,原始节点版本仍然存在,例如

$ node -v
v12.19.1

M
Micael Mota

在阅读了这个帖子并测试了几乎所有的建议之后,如果你使用 nvm,我发现了一个非常简单的解决方案:在命令中添加 nvm use

启动调试器需要更多时间,但这对我来说是值得的,因为现在我不必每次开始处理不同的项目时都执行 nvm use 并通过终端打开 Vscode。

这是我的 .vscode/launch.json 文件。祝你好运!

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "command": "nvm use && yarn start",
            "name": "Launch",
            "request": "launch",
            "type": "node-terminal",
        },
    ]
}

您还可以将 [ -s "./.nvmrc" ] && nvm use 添加到您的 ~/.bashrc 或 ~/.zshrc 以对所有项目实现相同的效果。预检查 .nvmrc,因此不会为没有命令的项目发出命令
a
asiera

我希望解决方案是特定于工作空间的,并且不需要任何操作(每次启动终端时都不必重做nvm use <version>)我找到的解决方案:

在我的项目的根目录中创建 .nvmrc 文件,该文件是我想要使用的旧节点版本,如 nvm 自述文件中所述,在我的 ~/.zshrc 中添加自动激活脚本,也在自述文件中(bashrc 脚本也在自述文件中)


当我将此脚本添加到我的 .zshrc 时,我从 VS Code 收到“无法在合理的时间内解析您的 shell 环境”错误
当您在终端中执行 nvm version 时,它有效吗?
要获得更轻量级的解决方案,只需将 [ -s "./.nvmrc" ] && nvm use 添加到 .zshrc.bashrc 等的底部
r
rsimp

设置默认别名仅在关闭 VS Code 的所有实例后对我有用。简单地重新加载窗口是行不通的。 nvm ls 会正确显示默认别名集,但会继续使用首次打开 VS 代码时设置的版本(在所有窗口中)。

还有跨 repos 的多个节点版本的问题,这确实是 nvm 旨在解决的问题。最后,我在 .zshrc 文件的底部添加了以下内容:

  [ -s "./.nvmrc" ] && nvm use

本质上,当一个新的 shell 启动时,它会检查当前目录中是否存在非空 .nvmrc,如果存在,则使用该版本。如果未安装该版本,您将收到一条消息。运行 nvm install 后,它应该在所有新的终端会话中正确加载。

@asiera 所指出的,您还可以使用 nvm README 中显示的目录更改的自动版本切换。虽然项目终端通常会始终在与 .nvmrc 文件相同的目录中打开,但此解决方案稍微简单一些,并且仅在终端启动时运行。


S
Stepan

那么,您的 nvm 配置良好,但其他版本的节点仍然继续接管?

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

brew uninstall --force node (yarn 没有系统节点也可以) 从 pkg 或其他非 nvm 方法安装的其他版本重新登录。现在,无论 shell 如何启动,都无法与 nvm 争夺路径。

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


为了Pete的爱,没有必要使用brew来安装节点。它有一个本地安装程序! nodejs.org/en/download
@jnovack 我的回答涵盖了 uninstalling brew-installed 版本的节点。请重新阅读。此外,使用 brew 安装 node 对于不需要 nvm 的人来说非常好,并且比原生安装程序具有优势。
Q
Quang Van

VSCode Shell args 似乎已被弃用,这里使用 VS Code settings.json 中的配置文件进行更新:

这摆脱了 -l 终端参数,将其变成交互式 shell 与登录 shell。

"terminal.integrated.profiles.osx": {
    "zsh (normal - me)": {
        "path": "zsh",
        "args": []
    }
},
"terminal.integrated.defaultProfile.osx": "zsh (normal - me)"

谢谢!答案 here 用于解释,here 用于旧 args 方式:


对我来说,这样设置就行了:"terminal.integrated.defaultProfile.osx": "zsh" 不需要 "terminal.integrated.profiles.osx"
C
Chukwunazaekpere

对我来说,我只是做了:

# in a separate terminal (i.e not in VScode teminal)
nvm install <node version>

然后在 VScode 终端中:

nvm use <the node version you installed>

k
kiranr

以下解决方案对我有用

首先使用以下命令安装和使用所需的节点版本和 nvm:nvm install v16.13.1 和 nvm use v16.13.1。然后在 Linux 上使用 which node 命令获取当前使用节点的路径名。它将是这样的 /usr/local/nvm/versions/node/v16.13.1/bin/node 最后在 launch.json 中使用这个路径名作为 runtimeExecutable 选项。

launch.json 文件

{
    "version": "0.2.0",
    "configurations": [
        {   
            "type": "pwa-node",
      -->   "runtimeExecutable": "/usr/local/nvm/versions/node/v16.13.1/bin/node",
            "request": "launch",
            "args": ["testcode/hunter.js","127.0.0.1:9229"],
            "name": "Launch Program",
            "skipFiles": [
                "<node_internals>/**"
            ],
            "program": "${workspaceFolder}/index.js"
        }
    ]
}

A
Andy

根据 nvm 的文档,您需要将此代码段添加到您的 ~/.bashrc~/.profile~/.zshrc 文件中,因此打开文件并将其粘贴进去,重新启动 vscode 并享受 nvm

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

来源:https://github.com/nvm-sh/nvm#manual-install


m
michelepatrassi

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

只需按照安装 here 并确保您的 bash_profile 已更新。


H
Harshit Ruwali

其他解决方案都不适合我。

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


注意:nvm alias default node 设置安装的节点的最新版本,而不是您想要的特定版本。
N
Nikolay Advolodkin

我在顶部尝试了几个选项,但它们都不起作用。我找到了一个简单的解决方案。在 VS Code 终端中:

单击终端下拉列表中的向下箭头 选择默认 Shell 选择“bash” 尝试 node -v 应该返回设置为默认 nvm 别名默认 v12.14.0 的正确版本


L
Leslie C

检查 MAC 上的默认交互式 shell。如果是zsh,如何将VS Code中的终端也设置为zsh模式?然后就可以在 Mac 上使用指定的节点版本了。这对我有用。

我正在使用 macOS Big Sur v11.2.1 + VS Code v1.55.1

Setting pictrue


B
Ba Tới Xì Cơ
sudo rm -rf /usr/local/opt/node@<YOUR_NODE_VERSION>

然后重新启动可视代码


这是不好的。使用 rm 命令意味着您正在删除一个文件。为什么要删除节点?
H
Hero Qu

如果使用 nvm,那么这可能会解决:

在 vscode setting.json 中更改 typescript 键,如下所示:

  "code-runner.executorMap": {

    // "typescript": "ts-node",
    "typescript": "node -r ${NVM_BIN}/../lib/node_modules/ts-node/register",

如果它对你有用,那么这是我的解释。

首先我试着把它

${NVM_BIN}/ts-node/register

但这没有用。然后我查看了目录,发现 ts-node 有一个符号链接:

ts-node -> ../lib/node_modules/ts-node/dist/bin.js

所以,我想这就是为什么普通的 'ts-node/register' 不能正确解析的原因,因为它实际上变成了 'ts-node/dist/bin.js/register' 这不应该工作。

希望这可能对某人有所帮助。


A
Ananthu

如果这些答案都不适合你,

如果您以前通过下载和解压缩安装了节点。转至 usr/local/lib,就会有一个名为 nodejs 的人坐在周围。

把他踢出去。

并再次将 nvm alias default 设置为首选版本。就这样,从此幸福快乐。至少对我有用。


您的答案可以通过额外的支持信息得到改进。请edit添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。您可以找到有关如何写出好答案的更多信息in the help center