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
在 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"
}
]}
解决方法是设置别名 default
。在 OS 终端运行 -
nvm alias default 7.8.0
打开 vscode,现在运行 node -v
返回 7.8.0
似乎 vscode 占用了这个(别名默认)值,而不是 nvm use X.X.X
设置的节点版本
重新启动 VS 代码以获取更改。
更新 (12/04/2018) - 此解决方案可能不适用于所有人。请参阅下面的答案以获取其他解决方案。
nvm use default
像这样将 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"
}
launch.json
文件?
我遇到了同样的问题,即无法在我的 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 prefix
或 nvm use --delete-prefix vx.x.x --silent
以取消设置。
在我的情况下,我为解决这个问题所做的是报告的同一问题的“解决方法”部分,基本上如下:
通过在最顶部的 ~/.bash_profile 中添加以下行来重置路径:PATH="/usr/local/bin:$(getconf PATH)"
之后,当我在两个编辑器上启动任何集成终端时,不再有警告,我可以与 nvm 交互,轻松在任何节点版本之间切换,完全没有问题。
这是 another 替代方案,以防万一这个没有太大帮助。
runtimeVersion
,但这只设置了特定任务的节点版本。这适用于整个集成终端实例。谢谢!注意。我必须在 .zshrc
中设置 PATH var,因为我正在使用 zsh 让它工作
提供的一些答案是正确的和赞成的,但有些不完整。这个程序对我有用:
在 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
我有同样的问题,但上面的答案没有帮助。
显然,当我使用 zsh
时,osx 的默认 shellArgs
设置为 bash
。我通过将用户设置中的 shellArgs
设置为空数组来解决问题:
"terminal.integrated.shellArgs.osx": []
which node
不同于 cli 而不是 vscode,这就是您的解决方案! 🚀
我正在使用 oh-my-zsh,它也没有使用 nvm 指定的节点版本。尝试了此处发布的几个建议,但我设法解决此问题的唯一方法是将以下行添加到 ~/.zshrc
的顶部
PATH="/usr/local/bin:$(getconf PATH)"
我发现的另一种解决方案是在使用 nvm 选择节点后简单地从 shell 启动代码。
您需要首先打开命令托盘并选择“将'代码'安装到路径中”。
https://i.stack.imgur.com/ryxlm.png
然后启动终端并通过 nvm 选择您的节点,然后启动“代码”。
https://i.stack.imgur.com/Qhh7s.png
nvm use default
有帮助。谢谢!
npm use
直接从项目目录打开 VSCode 解决了我的问题。十分感谢!
这里有很多复杂的答案。就我而言,这是由于先前已安装节点造成的。通过删除以下目录来修复它:rm -rf /usr/local/bin/npm
和 rm -rf /usr/local/bin/node
,然后在 VSC 中运行 nvm use default
以获取 nvm 安装的节点版本。
我遇到了同样的问题,我发现了一个奇怪的解决方法,将来可能对其他人有帮助。
如果我没有设置 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"
- 没有路径。
特别是对于外壳我没有问题,但你可以:
检查您的外壳是否正确配置或更改(您可能正在为 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”将所有参数推到一个位置。它可以是任何东西,但它必须在那里。
我尝试了所有建议的解决方案,但没有任何效果。
/usr/local/bin/node 指向某个地方。我创建了一个指向特定 nvm 节点文件夹的符号链接,这为我解决了这个问题:
ln -s /Users/mad/.nvm/versions/node/v11.1.0/bin/node /usr/local/bin/node
我有同样的问题,我发现我已经通过 brew
和 nvm
安装了 node
。我卸载了 brew
安装的 node
,现在终端和 Visual Studio 代码上的版本相同。
您无需修改默认节点版本。以下示例假定节点 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
我发现在调用代码之前在子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
在阅读了这个帖子并测试了几乎所有的建议之后,如果你使用 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,因此不会为没有命令的项目发出命令
我希望解决方案是特定于工作空间的,并且不需要任何操作(每次启动终端时都不必重做nvm use <version>
)我找到的解决方案:
在我的项目的根目录中创建 .nvmrc 文件,该文件是我想要使用的旧节点版本,如 nvm 自述文件中所述,在我的 ~/.zshrc 中添加自动激活脚本,也在自述文件中(bashrc 脚本也在自述文件中)
nvm version
时,它有效吗?
[ -s "./.nvmrc" ] && nvm use
添加到 .zshrc
、.bashrc
等的底部
设置默认别名仅在关闭 VS Code 的所有实例后对我有用。简单地重新加载窗口是行不通的。 nvm ls
会正确显示默认别名集,但会继续使用首次打开 VS 代码时设置的版本(在所有窗口中)。
还有跨 repos 的多个节点版本的问题,这确实是 nvm 旨在解决的问题。最后,我在 .zshrc
文件的底部添加了以下内容:
[ -s "./.nvmrc" ] && nvm use
本质上,当一个新的 shell 启动时,它会检查当前目录中是否存在非空 .nvmrc
,如果存在,则使用该版本。如果未安装该版本,您将收到一条消息。运行 nvm install
后,它应该在所有新的终端会话中正确加载。
如 @asiera 所指出的,您还可以使用 nvm README 中显示的目录更改的自动版本切换。虽然项目终端通常会始终在与 .nvmrc
文件相同的目录中打开,但此解决方案稍微简单一些,并且仅在终端启动时运行。
那么,您的 nvm 配置良好,但其他版本的节点仍然继续接管?
删除所有非 nvm 版本的节点:
brew uninstall --force node (yarn 没有系统节点也可以) 从 pkg 或其他非 nvm 方法安装的其他版本重新登录。现在,无论 shell 如何启动,都无法与 nvm 争夺路径。
注意:安装/升级 yarn 时,使用 brew install yarn --without-node
brew
来安装节点。它有一个本地安装程序! nodejs.org/en/download
brew
安装 node 对于不需要 nvm
的人来说非常好,并且比原生安装程序具有优势。
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"
对我来说,我只是做了:
# in a separate terminal (i.e not in VScode teminal)
nvm install <node version>
然后在 VScode 终端中:
nvm use <the node version you installed>
以下解决方案对我有用
首先使用以下命令安装和使用所需的节点版本和 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"
}
]
}
根据 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
其他解决方案都不适合我。
所以我跑了nvm alias default node
,这为我解决了这个问题。
nvm alias default node
设置安装的节点的最新版本,而不是您想要的特定版本。
我在顶部尝试了几个选项,但它们都不起作用。我找到了一个简单的解决方案。在 VS Code 终端中:
单击终端下拉列表中的向下箭头 选择默认 Shell 选择“bash” 尝试 node -v 应该返回设置为默认 nvm 别名默认 v12.14.0 的正确版本
检查 MAC 上的默认交互式 shell。如果是zsh,如何将VS Code中的终端也设置为zsh模式?然后就可以在 Mac 上使用指定的节点版本了。这对我有用。
我正在使用 macOS Big Sur v11.2.1 + VS Code v1.55.1
sudo rm -rf /usr/local/opt/node@<YOUR_NODE_VERSION>
然后重新启动可视代码
如果使用 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' 这不应该工作。
希望这可能对某人有所帮助。
如果这些答案都不适合你,
如果您以前通过下载和解压缩安装了节点。转至 usr/local/lib
,就会有一个名为 nodejs 的人坐在周围。
把他踢出去。
并再次将 nvm alias default
设置为首选版本。就这样,从此幸福快乐。至少对我有用。
launch.json
文件在哪里?