Reputation: 22587
Is it possible for VS Code to use node version specified by NVM?
I have 6.9.2 installed locally. Even after switching to another version, from the OS X terminal (not the VS Code terminal), restarting VS Code, VS Code still shows using 6.9.2.
OS X terminal
MacBook-Pro-3:~ mac$ node -v
v7.8.0
VS Code Terminal
MacBook-Pro-3:QB-Invoice-API mac$ node -v
v6.9.2
Upvotes: 236
Views: 300670
Reputation: 901
Crazy this is still an issue in 2025 (soon).
I use VSCode remote with zsh, and my .zshrc is in order, so nvm works as expected in normal terminal sessions, but not in VSCode. None of the previous answers helped, as I kept observing VSCode adding old node version to $PATH
variable in each new terminal session.
Two brand new solutions found:
SOLUTION 1
In VSCode settings disable Inherit Env, and new terminal sessions will have node version set by nvm. However, this probably could break some python venv-related stuff, so I re-enabled this setting and kept digging.
SOLUTION 2
Simply use nvm to uninstall your previous node version, and VSCode somehow picks up on that and offers new version from that moment on:
nvm alias default 22.11.0
nvm use default
nvm uninstall 21.7.3
Upvotes: 3
Reputation: 17
As I am unable to comment yet, i wish to expand upon the accepted answer for other people who run vscode from wsl by launching code
in the wsl distro terminal.
Vscode will default to the node version used by that terminal. So many sure you nvm use or set a default and re-launch in that terminal
example:
Inside VSC (new terminal)
>node -v
v16.20.2
>nvm ls
-> v16.20.2
v20.15.0
default -> 20 (-> v20.15.0)
WSL terminal
>node -v
v16.20.2
>nvm use 20
Now using node v20.15.0 (npm v10.7.0)
>code
Inside VSC (new terminal)
>node -v
v20.15.0
Fixed it for me. no longer have to re-do nvm use 20 every time i make a new terminal in vsc.
Upvotes: 0
Reputation: 11607
Some of the answers provided are correct and upvoted, but somewhat incomplete. This procedure worked for me:
node -v
. You'll get for instance v10.12.0
.nvm use v12.14.0
)Cmd
+ Shift
+ p
and choose Preferences > Open Settings (JSON)"terminal.integrated.shellArgs.osx": []
to your user config
args
into your settings.json "terminal.integrated.profiles.[osx|windows|linux][nameOfShell].args=['--login']
(as seen here)Cmd
+ Shift
+ p
and choose Shell Command: Install 'code' command in PATHcode
. This will open VS Code with a new and updated bash
/ zsh
session.node -v
. You'll get v12.14.0
.Bonus: If you always want to get a particular node version on VS Code's terminal, set it as default by opening a terminal window outside VS Code and running:
nvm alias default v12.14.0
Upvotes: 50
Reputation: 531
Posting it in June 2023 because there are lots of answers telling to re-install node and asking to make lots of configuration changes. In fact the solution is just to Restart your VSCode!
Just make sure that your Mac/PC Terminal have the default node version set as per your need and then restart the VSCode. Best tool to switch between the Node Versions is NVM.
nvm list
nvm alias default v18.00.0
.nvm install v18.00.0
Cheers!
Upvotes: 4
Reputation: 753
Lots of complicated answers here. In my case, this was caused by Node previously having been installed. Fixed it by deleting the following directories:
rm -rf /usr/local/bin/npm
rm -rf /usr/local/bin/node
Then running nvm use default
in VS Code to pick up the Node version installed by nvm.
Upvotes: 35
Reputation: 11
My solution to this was as follows - opening a terminal node reported correct version as specified by nvm. Opening a terminal in VS Code it defaulted to the "default" node version.
Therefore the simplest solution for me was:
edit ~/.zshrc After the export of NVM_DIR, that was automatically added, add the following line:
nvm alias default `node -v`
Thus every time login it resets the default node version.
If you run nvm use 14
then run source ~\.zshrc
or the above reset alias command, then in VSCode should always have correct version when opening terminal.
Upvotes: 0
Reputation: 589
I had the same problem of being unable to keep my node version specified trough nvm in my OS X environment not only with VSCode but also with Atom Editor (using the platformio-ide-terminal package for managing the integrated terminal in it). None of the suggestions in the previous answers worked for me, besides me not using the debugger but using gulp and grunt for specific tasks. Apparently nvm does not get along with the integrated terminals or sub shells at least in these editors because when loading them the environment variable $PATH is modified internally and does the following according to a comment by one of the contributors of this package in this issue reported here 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.
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."
I was always getting this message when launching any integrated terminal:
nvm is not compatible with the npm config "prefix" option: currently set to "/usr/local"
Run npm config delete prefix
or nvm use --delete-prefix vx.x.x --silent
to unset it.
What I did to solve this in my case was the "workaround" part of that same issue reported, which is to reset the path by adding the following line inside my ~/.bash_profile
at the very top before anything else:
PATH="/usr/local/bin:$(getconf PATH)"
And after that no more warnings when I launch any integrated terminal on both editors and I can interact with nvm to switch between any node version easily and without problems at all.
Here it is another alternative just in case this one doesn`t help that much.
Upvotes: 47
Reputation: 22587
The solution is to set alias default
. In the OS terminal run -
nvm alias default 7.8.0
Open vscode, now running node -v
returns 7.8.0
It seems vscode takes up this (alias default) value and not the node version that is set by nvm use X.X.X
Restart VS code for it to pick up the changes.
Upvotes: 225
Reputation: 26487
I needed to vs code to be aware of the node version, not the terminal. Starting code
from a terminal is an option, but if you forget...
A much more flexible way is to use automator to create the environment you need before starting vs code.
Run Automator
and start a new Application project. Just add a Shell-Script (under Utilities) and add the following line to create a "normal" (login+interactive) shell, where you may start code:
zsh -lic code
Save it in your Application folder with a name you'l find it every time you look for vs code (I either type vs or code, so I called it "vs code runner")
The bonus here is that you can apply other configurations too. the idea is the same:
Upvotes: 1
Reputation: 472
In case you'd like to set the Node version for your Visual Studio Code NPM script runner, here's what works on a per-project basis. So, without having to set global nvm
defaults.
By "NPM script runner" I mean the hover-and-execute-scripts functionality directly in package.json
:
Place an .nvmrc
file containing the project's Node version into the root folder of your project.
Enable automatic environment as described here: https://github.com/nvm-sh/nvm#deeper-shell-integration.
Open VS Code's settings.json
and define your preferred shell (in my case, it's zsh
). For the automation profile, it's important to define a login and interactive shell (arguments -l
and -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",
}
},
Opening a new shell triggers NVM (The icons show which setting is working):
And running an NPM script triggers NVM:
Cheers!
Upvotes: 13
Reputation: 1012
For me I simply did:
# in a separate terminal (i.e not in VScode teminal)
nvm install <node version>
then in VScode terminal:
nvm use <the node version you installed>
Upvotes: 2
Reputation: 831
Setting the default alias only worked for me after closing all instances of VS Code. Simply reloading the window wouldn't work. nvm ls
would show the default alias set correctly but would keep using the version set when VS code was first opened (across all windows).
There's also the issue of having multiple node versions across repos, which is really what nvm is meant to solve. In the end I added the following to the bottom of my .zshrc
file:
[ -s "./.nvmrc" ] && nvm use
Essentially when a new shell starts, it checks to see if a non-empty .nvmrc
exists in the current directory and if so, uses that version. If that version is not installed you will get a message saying so. After running nvm install
it should load properly in all new terminal sessions.
You can also use the automatic version switching on directory changes shown in the nvm README as @asiera pointed out. Although a project terminal will typically always open in the same directory as your .nvmrc
file, so this solution is a bit simpler and only runs on terminal startup.
Upvotes: 10
Reputation: 3012
According to the docs of nvm, you need to add this code snippet to your ~/.bashrc
, ~/.profile
, or ~/.zshrc
file, so open the file and paste this in, restart vscode and enjoy 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
source: https://github.com/nvm-sh/nvm#manual-install
Upvotes: 3
Reputation: 31
If none of this answers worked for you,
If you have previously installed node by downloading and unzipping it.
Go to usr/local/lib
and there will be this guy sitting around named nodejs.
Kick him out.
And set nvm alias default
to preferred version again.
That's it, happily ever after. At least worked for me though.
Upvotes: 1
Reputation: 2465
following solution worked for me
nvm
with these commands: nvm install v16.13.1
and nvm use v16.13.1
.which node
command on Linux.
it will be something like this /usr/local/nvm/versions/node/v16.13.1/bin/node
launch.json
for runtimeExecutable
option.the launch.json
file
{
"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"
}
]
}
Upvotes: 3
Reputation: 870
I wanted the solution to be workspace specific and not requiring any action on my part (not having to redo nvm use <version>
each time i start a terminal)
The solution I found:
.nvmrc
file at the root of my project that old the node version I want to use as stated in nvm ReadMeUpvotes: 3
Reputation: 2340
In VS Code:
launch.json
fileruntimeVersion
attribute inside configurations as shown belowIn this example, we are assuming 4.8.7 is already installed using 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"
}
]}
Upvotes: 206
Reputation: 951
If one uses nvm, then this may work out:
In vscode setting.json change typescript key like this:
"code-runner.executorMap": {
// "typescript": "ts-node",
"typescript": "node -r ${NVM_BIN}/../lib/node_modules/ts-node/register",
If it works for you, then here is my explanation.
First I tried to just put it
${NVM_BIN}/ts-node/register
but that didn't work. Then I looked inside the directory and found out that ts-node there is a symlink:
ts-node -> ../lib/node_modules/ts-node/dist/bin.js
So, I guess that is why plain 'ts-node/register' is not resolving properly, because it actualy becomes 'ts-node/dist/bin.js/register' which shouldn't work.
Hope that might help someone.
Upvotes: 1
Reputation: 492
sudo rm -rf /usr/local/opt/node@<YOUR_NODE_VERSION>
then restart the Visual Code
Upvotes: 1
Reputation: 12095
VSCode Shell args seems to be deprecated, here's update using profiles in VS Code's settings.json
:
This gets rid of the -l
terminal argument turning it into an interactive shell vs a login shell.
"terminal.integrated.profiles.osx": {
"zsh (normal - me)": {
"path": "zsh",
"args": []
}
},
"terminal.integrated.defaultProfile.osx": "zsh (normal - me)"
Thanks! the answers here for explanation and here for old args way:
Upvotes: 3
Reputation: 43
Check your default interactive shell on your MAC. If it's zsh, how about setting the terminal in VS Code to zsh mode as well? Then you can use the specified node version on the Mac. This works for me.
Upvotes: 0
Reputation: 580
After reading this thread and testing almost all suggestions, I found a very simple solution if you are using nvm: Add nvm use
in the command.
It's gonna take a little more time to start the debugger, but it is worth it to me because now I don't have to execute nvm use
and open Vscode by the terminal every time I start working on a different project.
Here is my .vscode/launch.json
file. Good luck!
{
// 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",
},
]
}
Upvotes: 4
Reputation: 2230
I tried several of the options here at the top and they didn't work. I found a simple solution. In the VS Code terminal:
node -v
and that should return the correct version that was set as default nvm alias default v12.14.0
Upvotes: 0
Reputation: 2528
I found that setting the node version locally in a sub shell before calling code works well, while not changing the version in the current shell, e.g.
$ (nvm use 14; code .)
Therefore, to make it work transparently for any project folder, create a file .precode
in the project folder with shell commands to source before starting code - e.g.,
nvm use 14
Then add to ~/.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'
(Note: Run source ~/.bashrc
in any shell opened before the edit in order for the edit to take effect.)
Then, assuming the necessary file ~/myproject/.precode
exists, starting code with
$ code ~/myproject
will result in some diagnostic output on the shell, e.g.
source github/myproject/.precode
Now using node v14.15.1 (npm v6.14.8)
as well launching a new vscode window with the correct node version in the terminal window and debugger. However, in the shell from which it was launched, the original node version remains, e.g.
$ node -v
v12.19.1
Upvotes: 6
Reputation: 17
None of the other solutions worked for me.
So I ran nvm alias default node
and this fixed it for me.
Upvotes: 0
Reputation: 1236
So, your nvm is configured well, but other version of node STILL keeps taking over?
Remove all non-nvm versions of node:
brew uninstall --force node
(yarn will be fine without system node)Note: When installing/upgrading yarn, use brew install yarn --without-node
Upvotes: 3
Reputation: 4327
You don't need to modify your default node version. The following example assumes that node 6 is your default version and you want VSCode to reference version 7 of node:
# 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
Upvotes: 4
Reputation: 3077
I had this same issue and I found a strange workaround that may be helpful to someone else in the future.
If I do not set eslint.runtime
my system was running node v10.11.0
for eslint server, whereas I wanted it to be running v12.13.0
which I had installed and made default via nvm
.
I found that the v10 version of node was installed by brew
based on @franziga's answer but my desired version of node was installed by nvm
. So, I uninstalled v10.11.0
via brew and closed/reopened VS Code. Strangely, eslint was still reporting that it was started using v10.
I tried running a shell without any changes to my PATH
in any startup scripts, and the version of node was still correctly pointed to v12 as expected, but VS code still starts up v10 for eslint.
I'm not sure how to check the path of the executable that is being run by eslint, and if I open an integrated terminal everything works fine with the expected version of node (v12).
I found that if I set "eslint.runtime": "node"
in settings.json
that it will now use whatever version of node
was active when I opened vscode using code .
on the terminal. Just "node"
- no path.
Upvotes: 12
Reputation: 26487
Particularly with the shell I had no problems, but you may:
terminal.integrated.env.<platform>
I had issues with vscode itself and no solution could help me. So I finished using the following launch script.
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"program": "${workspaceFolder}/server.js",
"runtimeExecutable": "/bin/bash",
"runtimeArgs": ["-c", ". ~/.nvm/nvm.sh;nvm run default \"$@\"", "dummy"]
},
this assumes you have it configure for bash (otherwise change it to your shell) and you want to use the default
node version as configured by nvm (you may also change it).
Note: The "dummy" parameter is required so the rest of the parameters are properly parsed.
A longer explanation of "dummy": Shell scripts use positional parameters where the first one will be the script location itself (addressed by $0
), when using the -c
flag the script is read inplace an there is no $0
being set. vscode will pass some arguments, like the node start script location which will be wrongly interpreted, so "dummy" pushes all parameters one spot. It can be just anything, but it must be there.
Upvotes: 7
Reputation: 2076
Did not tried all of the solution, but for me updating nvm simply worked.
Just follow the installation here and make sure that you bash_profile
is updated.
Upvotes: 0