はじめに
Windowsでnvm(nvm-windows)を使ってNode.jsのバージョンを管理していると、nvm useが全ターミナル共通で切り替わってしまう問題に遭遇します。他のバージョン管理ツール(fnm、Voltaなど)を導入できない制約下で、ターミナルごとにNode.jsのバージョンを固定する方法を紹介します。
問題
nvm-windowsはUnix版nvmと異なり、nvm useを実行すると**全ターミナル共通のシンボリックリンク(参照の切り替え)**を書き換えます。
そのため、以下のような状況になります。
- プロジェクトAのターミナルで
nvm use 24.18.0を実行 - 別で開いていたプロジェクトBのターミナル(v16.15.0で作業していた)まで 24.18.0に統一されてしまう
# ターミナルB(本来v16で動かしたい)
PS > node -v
v24.18.0 # ← 勝手に変わってしまった
プロジェクトAではNode 16、プロジェクトBではNode 24、というように同時に別バージョンを使いたいのに、それができません。
解決方法
nvm use を使わず、そのターミナル(セッション)のPATHの先頭に、使いたいバージョンのフォルダを追加することで解決できます。
1. nvmのインストール先を確認する
nvm-windowsのインストール先は環境変数 NVM_HOME に入っています。
echo "$env:NVM_HOME"
# 例: C:\Users\xxxxxx\AppData\Local\nvm
各バージョンは $env:NVM_HOME\v<バージョン> のフォルダに格納されています。
2. node.exe が存在するか確認する
Test-Path "$env:NVM_HOME\v16.15.0\node.exe"
# True なら存在する
3. そのターミナルのPATH先頭にバージョンを追加する
Node 16を使いたいターミナルで実行します。
$env:Path = "$env:NVM_HOME\v16.15.0;" + $env:Path
Node 24を使いたい別のターミナルでは、こちらを実行します。
$env:Path = "$env:NVM_HOME\v24.18.0;" + $env:Path
しくみ
-
$env:Pathは PowerShellで環境変数PATH(コマンドの検索先フォルダ一覧)を読み書きする書き方 -
nodeと打つと、PATHを先頭から探して最初に見つかったnode.exeが使われる - 先頭に目的バージョンのフォルダを足すことで、そのバージョンが優先される
-
+ $env:Pathで、元のPATHを後ろに残している
影響範囲
この変更は実行したターミナル(セッション)内だけに効きます。
- 他のターミナルには影響しない
- 今後新しく開くターミナルにも影響しない
- そのターミナルを閉じれば元に戻る
これにより、node も npm も指定したバージョンになり、複数プロジェクトを別バージョンで同時に動かせます。
# ターミナルA
$env:Path = "$env:NVM_HOME\v16.15.0;" + $env:Path
node -v # v16.15.0
# ターミナルB(同時に別ウィンドウで)
$env:Path = "$env:NVM_HOME\v24.18.0;" + $env:Path
node -v # v24.18.0
おわりに
nvm-windowsの nvm use はグローバルに作用するため、複数バージョンの同時利用には向きません。しかし、PATHをセッション単位で書き換えるという発想を使えば、追加ツールなしでターミナルごとにNode.jsのバージョンを固定できます。同じ制約で困っている方の参考になれば幸いです。
参考
JISOUのメンバー募集中!
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか?
興味のある方は、ぜひホームページをのぞいてみてください!
▼▼▼
https://projisou.jp