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

Visual Studio Code to use node version specified by 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

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

nvm alias default 7.8.0

打开vscode,现在运行宁node -vreturns7.8.0

似乎 vscode 占用了这个(别名默认)值而不是 nvm use X.X.X

设置的节点版本

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

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

像这样将 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"
}

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

您需要先打开命令托盘,然后select》将'code'安装到 路径".

然后通过 nvm 启动终端和 select 您的节点,然后启动 "code"。

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

" @charsleysa I know why nvm is throwing this error. In your subshell, somehow the /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin part of your PATH has been moved from the end of the PATH to the start.

  • When nvm is then started, it calls nvm_change_path (my contribution changed it to this from nvm_prepend_path), which modifies the nvm-relevant part of the path in place.
  • Nvm then checks the current npm prefix by asking npm what it is. Since /usr/local/bin/npm now has precendence, it reports /usr/local/bin.
  • Nvm then checks whether the current prefix as reported by npm is in the directory tree of the current nvm node version (at this stage, the installation directory of the node version your default nvm alias resolves to).
  • The prefix is not part of that tree, so it deactivates itself (calling nvm_strip_path in the process, which is why there's no nvm-related path in your subshell's PATH), and bails with the error you're getting. macOS's /etc/profile (or /etc/zprofile) calls /usr/libexec/path_helper, which does the PATH switcheroo.

In the parent shell, the PATH doesn't yet have an nvm dir in it, so by the time nvm runs, it prepends its directory to the path. But in the subshell, PATH has been reconfigured by macOS to put any non-system directories at the end and we have the problem."

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

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

在我的案例中,我为解决此问题所做的工作是所报告的同一问题的 "workaround" 部分,其本质如下:

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

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

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

在 VS 代码中:

  • 转到您的 launch.json 文件
  • 在配置中添加 runtimeVersion 属性,如下所示

在此示例中,我们假设 4.8.7 已使用 nvm 安装:

{
"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"
    }
]}

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

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

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

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

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

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

我遇到了同样的问题,我发现 brewnvm 安装了 node。我卸载了 brew 安装的 node,现在终端和 visual studio 代码上的版本都一样了。

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

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

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

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

特别是 shell 我没有遇到任何问题,但您可能会:

我遇到了 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 脚本使用位置参数,其中第一个参数是脚本位置本身(由 [=13=] 寻址),当使用 -c 标记脚本已就地读取,并且没有设置 [=13=]。 vscode 会传递一些参数,例如会被错误解释的节点启动脚本位置,因此 "dummy" 将所有参数推到一个位置。它可以是任何东西,但它必须存在。

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

如果我不设置 eslint.runtime 我的系统是 运行ning 节点 v10.11.0 用于 eslint 服务器,而我希望它是 运行ning v12.13.0 我已经通过 nvm.

安装并设为默认值

根据@franziga 的回答,我发现 v10 版本的节点是由 brew 安装的,但我想要的节点版本是由 nvm 安装的。因此,我通过 brew 和 closed/reopened VS Code 卸载了 v10.11.0。奇怪的是,eslint 仍然报告它是使用 v10 启动的。

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

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

解决方案(对我而言):

我发现,如果我在 settings.json 中设置 "eslint.runtime": "node",它现在将使用当我使用 [=21= 打开 vscode 时处于活动状态的 node 的任何版本] 在终端上。只是 "node" - 没有路径。

提供的一些答案是正确的并且得到了好评,但有些不完整。这个程序对我有用:

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

奖励: 如果您总是想要在VS Code的终端,通过打开终端window outside VS Code将其设为默认和 运行宁:

nvm alias default v12.14.0

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

所以,你的 nvm 配置好了,但是其他版本的节点仍然在接管?

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

  1. brew uninstall --force node(没有系统节点yarn也可以)
  2. Other version installed from pkg or other non-nvm method
  3. 重新登录。现在,无论 shell 如何启动,都无法与 nvm 争夺路径。

注意:当installing/upgrading纱时,使用brew install yarn --without-node

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

所以我 运行 nvm alias default node 这为我修复了它。

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

$ (nvm use 14; code .)

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

nvm use 14

然后添加到~/.bashrc

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

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

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

$ code ~/myproject

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

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

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

$ node -v
v12.19.1

我在顶部尝试了几个选项,但没有用。我找到了一个简单的解决方案。在 VS 代码终端中:

  1. 单击终端下拉菜单中的向下箭头
  2. Select 默认 Shell
  3. Select 'bash'
  4. 试试 node -v 应该 return 设置为默认的正确版本 nvm alias default v12.14.0

在阅读了这个帖子并测试了几乎所有的建议之后,如果您使用的是 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",
        },
    ]
}

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

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

Setting pictrue

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)"

谢谢!旧参数方式的答案 for explanation and

sudo rm -rf /usr/local/opt/node@<YOUR_NODE_VERSION>

然后重启 Visual Code

如果使用 nvm,那么这可能会成功:

在 vscode setting.json 中像这样更改打字稿键:

  "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',这不应该起作用。

希望对某人有所帮助。

这里有很多复杂的答案。在我的例子中,这是由之前安装的节点引起的。通过删除以下目录修复它:rm -rf /usr/local/bin/npmrm -rf /usr/local/bin/node,然后在 VSC 中删除 运行 nvm use default 以获取 nvm 安装的节点版本。

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

  1. 在我的项目的 root 中创建 .nvmrc 文件,该文件旧 node version 我想按说明使用在 nvm ReadMe
  2. 在我的 ~/.zshrc 中添加自动激活脚本也在 ReadMe(bashrc 脚本也在自述文件中)

以下解决方案对我有用

  1. 首先使用 nvm 安装和使用所需的节点版本,使用这些命令:nvm install v16.13.1nvm use v16.13.1
  2. 然后在 Linux 上使用 which node 命令获取当前使用的节点的路径名。 它将是这样的 /usr/local/nvm/versions/node/v16.13.1/bin/node
  3. 最终在 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"
        }
    ]
}

如果 none 个答案对您有用,

如果您之前通过下载和解压缩安装了节点。 去 usr/local/lib 那里会有一个叫 nodejs 的人。

踢他出去。

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

根据 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

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

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

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

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

您还可以在 nvm README as @asiera 指出的目录更改中使用自动版本切换功能。尽管项目终端通常总是在与 .nvmrc 文件相同的目录中打开,因此此解决方案更简单一些,并且仅在终端启动时运行。

对我来说,我只是做了:

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

然后在 VScode 终端中:

nvm use <the node version you installed>