VisualStudio 代码使用由 NVM 指定的节点版本

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

我在本地安装了6.9.2。即使在切换到另一个版本后,从 OS X 终端(而不是 VS 代码终端)重新启动 VS 代码,VS 代码仍然显示使用6.9。

OS X 终端

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

VS 码终端

MacBook-Pro-3:QB-Invoice-API mac$ node -v
v6.9.2
151956 次浏览

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

nvm alias default 7.8.0

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

Vscode 似乎采用了这个(别名缺省值)值,而不是 nvm use X.X.X设置的节点版本

重新启动 VS 代码,让它接收更改。

像这样把 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 启动代码。

您需要首先打开命令托盘并选择“ install‘ code’into 路径」。

enter image description here

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

enter image description here

我遇到了同样的问题,不能在 OS X 环境中使用 VSCode 和 Atom Editor (使用 platformio-ide 终端包管理其中的集成终端)保持节点版本指定的 trough nvm。除了我没有使用调试器,而是对特定的任务使用咕噜咕噜的声音之外,以前的答案中没有一个建议对我有用。显然,nvm 至少在这些编辑器中无法与集成终端或子 shell 相处,因为在加载它们时,环境变量 $PATH 在内部被修改,并且根据本期 NVM 在嵌套 shell # 1652中加载失败报道的这个软件包的贡献者之一的评论执行以下操作:

我知道为什么 nvm 抛出这个错误。在子 shell 中,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,这就是为什么在 subshell 的 PATH 中没有与 nvm 相关的路径) ,并且在出现错误后退出。 MacOS 的/etc/profile (或/etc/zprofile)调用/usr/libexec/PATH _ helper,它执行 PATH 切换。

在父 shell 中,PATH 中还没有 nvm dir,因此在运行 nvm 时,PATH 将其目录添加到路径中。但在子 shell 中,macOS 对 PATH 进行了重新配置,将任何非系统目录放在了最后,我们遇到了问题。”

在启动任何集成终端时,我总是收到这样的信息:

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 交互,在任何节点版本之间轻松切换,完全没有问题。

这里是 另一个的替代方案,只是以防万一这一个没有帮助那么多。

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

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

显然,当我使用 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

我有同样的问题,我发现我有 node安装的 brewnvm。我卸载的 node安装的 brew和版本的终端和视觉工作室的代码是相同的。

我使用的是 天啊,它也没有使用 nvm 指定的节点版本。在这里我尝试了一些建议,但是我解决这个问题的唯一方法是在 ~/.zshrc的顶部添加以下代码行

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

没有尝试所有的解决方案,但对我来说,更新 nvm 只是工作。

只需按照安装 给你操作,并确保更新了 bash_profile

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

我有 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节点版本(您也可以更改它)。

注意 : 需要“虚拟”参数,以便正确解析其余参数。

对“虚拟”的一个更长的解释: Shell 脚本使用位置参数,其中第一个参数将是脚本位置本身(由 $0处理) ,当使用 -c标志时,脚本被读取到没有设置 $0的地方。Vscode 将传递一些参数,比如节点开始脚本位置,这将被错误地解释,因此“虚拟”将所有参数推到一个位置。它可以是任何东西,但它必须存在。

我也遇到过同样的问题,我发现了一个奇怪的变通方法,可能在未来对其他人有帮助。

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

我发现节点的 v10版本是由 brew根据@franziga 的回答安装的,但我想要的节点版本是由 nvm安装的。所以,我卸载 v10.11.0通过酿造和关闭/重新打开 VS 代码。奇怪的是,eslint 仍然报告说它开始使用 v10。

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

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

解决方案(对我来说) :

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

有些答案是正确的,但是有些不完整,这个过程对我很有效:

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

好处: 如果您想在 VS 代码的终端上获得特定的节点版本,通过打开终端窗口 < em > out 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. 没有系统节点的纱线可以很好地工作
  2. 从 pkg 或其他非 nvm 方法安装的其他版本
  3. 重新登录。现在,无论如何启动 shell,都不能使用 nvm 争夺路径。

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

其他的方法对我都不管用。

所以我运行了 nvm alias default node,这个帮我修复了它。

我发现在调用代码之前在子 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

将对 shell 产生一些诊断输出,例如。

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

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

$ node -v
v12.19.1

我在顶端尝试了几种选择,但都不起作用。我找到了一个简单的解决办法。在 VS 代码终端:

  1. 单击终端下拉列表中的向下箭头
  2. 选择 Default Shell
  3. 选择“ bash”
  4. 尝试 node -v,它应该返回设置为默认 nvm alias default v12.14.0的正确版本

在阅读了这个线程并测试了几乎所有的建议之后,我发现了一个非常简单的解决方案,如果您正在使用 nvm: Add 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

布景

VSCode Shell 参数似乎不被推荐使用,下面是在 VS Code 的 settings.json中使用概要文件的更新:

这样就消除了将 -l终端参数转换为交互式 shell 而不是登录 shell 的操作。

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

谢谢! 答案 给你为解释和 给你为旧的争论的方式:

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

然后重新启动可视化代码

如果使用 nvm,那么可以得出:

在 vscode seting.json 中,像这样改变类型脚本键:

  "code-runner.executorMap": {


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

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

起初我只是想把它

${NVM_BIN}/ts-node/register

但是没有用。然后我查看了目录,发现 t- 节点有一个符号链接:

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. 在我的项目的 处创建 .nvmrc文件,这个文件是我在 nvm自述中使用的旧的 节点版本文件
  2. 在 my ~/. zhrc 中添加自动激活脚本,也在 自述中(bashrc 脚本也在 readme 中)

下面的解决方案对我有效

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

如果这些答案对你都不起作用,

如果您先前已经通过下载和解压缩安装了节点。 去 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 代码的所有实例之后才有效。简单地重新装载窗口是行不通的。nvm ls将正确地显示默认别名集,但在 VS 代码首次打开时(跨所有窗口)将继续使用版本集。

还存在跨回购协议使用多个节点版本的问题,这正是 nvm 要解决的问题。最后,我在 .zshrc文件的底部添加了以下内容:

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

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

正如 @ asiera所指出的,您还可以使用在 nvm自述中显示的目录更改上的自动版本切换。虽然项目终端通常总是在与 .nvmrc文件相同的目录中打开,但是这个解决方案稍微简单一些,只在终端启动时运行。

对我来说,我只是这样做了:

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

然后在 VScode 终端:

nvm use <the node version you installed>

如果您想为 VisualStudio 代码 NPM 脚本运行程序设置 Node 版本,以下是针对每个项目的工作方式。因此,没有必须设置全局 nvm默认值。

我说的“ NPM 脚本运行器”是指 package.json中直接的悬停和执行脚本功能:

Visual Studio Code NPM script runner

一步一步来

  1. 将包含项目的 Node 版本的 .nvmrc文件放入项目的根文件夹中。

  2. 启用这里描述的自动环境: https://github.com/nvm-sh/nvm#deeper-shell-integration

  3. 打开 VS Code 的 settings.json并定义您首选的 shell (在我的例子中,它是 zsh)。对于自动化概要文件,重要的是定义一个 登入互动 shell (参数 -l-i) :

    "terminal.integrated.automationProfile.osx": {
"path": "/bin/zsh",
"icon": "play",
"args": ["-l", "-i"],
},
"terminal.integrated.profiles.osx": {
"bash": null,
"zsh": {
"path": "/bin/zsh",
"icon": "star",
}
},

结果

打开一个新的 shell 触发 NVM (图标显示哪个设置正在工作) :

enter image description here

运行 NPM 脚本触发 NVM:

enter image description here

enter image description here

干杯!

我需要 VS 代码来了解节点版本,而不是终端。从终端启动 code是一种选择,但是如果你忘了..。

一种更灵活的方法是在开始编写代码之前使用自动化程序创建所需的环境。

运行 Automator并启动一个新的 Application 项目。只需添加一个 Shell-Script (在实用程序下)并添加以下代码行来创建一个“普通”(登录 + 交互) shell,在这里您可以开始编码:

zsh -lic code


看起来是这样的: automator-shell script

保存在您的应用程序文件夹与名称,你会发现它每次你查找 vs 代码(我要么键入 vs 或代码,所以我称之为“ vs 代码运行器”)

这里的好处是,你也可以应用其他配置。这个想法是一样的:

  1. 建立环境
  2. 星号