[Node.js] 解決 nvm for Windows(nvm4w)「nvm use」切換版本沒反應的問題
問題描述
在 Windows 上使用 nvm for Windows(nvm4w) 管理多個 Node.js 版本時,執行切換版本的指令:
nvm use 20.20.2
指令執行後沒有任何反應、也不會報錯,但用 node -v 確認時,版本號卻完全沒有改變,實際上還是停留在切換前的版本。反覆重試、重開終端機都沒用。
原因分析
nvm4w 管理多版本 Node.js 的方式,是在一個固定路徑(預設為 C:\nvm4w\nodejs)
建立一個目錄連結(junction),指向實際安裝的某個版本資料夾,例如 ...\nvm\v20.20.2。
這條連結才是系統 PATH 實際指向的位置,所以只要連結指到哪個版本,node -v 就會回報哪個版本。
問題就出在這裡:nvm use 內部理應要先移除舊的 junction、再建立新的 junction 指向目標版本,但實際測試下來這個「移除舊連結 → 重建新連結」的動作偶爾會失效,導致連結沒有被更新——指令本身不報錯,版本卻沒有真正切換。
解決辦法:手動控制切換
既然問題出在 nvm use 內部重建連結的邏輯不可靠,那就繞過它,改成自己寫一支批次檔,直接用
rmdir 刪掉舊 junction,再用
mklink /J 重新建立一次,確保連結一定會指向正確版本。
把下面這支腳本存成 %USERPROFILE%\.local\bin\nvmuse.cmd
(%USERPROFILE% 是 Windows 的環境變數,會自動代入目前登入的使用者資料夾路徑,不需要自己改成固定的使用者名稱):
@echo off
setlocal enabledelayedexpansion
set "NVM_ROOT=%USERPROFILE%\AppData\Local\nvm"
set "NVM_LINK=C:\nvm4w\nodejs"
if "%~1"=="" (
echo Usage: nvmuse ^<version^> e.g. nvmuse 20.20.2
exit /b 1
)
set "VER=%~1"
set "VER=%VER:v=%"
set "VERDIR=%NVM_ROOT%\v%VER%"
if not exist "%VERDIR%" (
echo [Not installed: v%VER% - running nvm install...]
nvm install %VER%
)
if not exist "%VERDIR%" (
echo [Install failed: %VERDIR% not found - aborting]
exit /b 1
)
if exist "%NVM_LINK%" (
rmdir "%NVM_LINK%" >nul 2>&1
)
mklink /J "%NVM_LINK%" "%VERDIR%" >nul
if errorlevel 1 (
echo [Failed to create junction]
exit /b 1
)
echo.
echo Switched to:
node -v
npm -v
使用方式
- 把
%USERPROFILE%\.local\bin這個資料夾加入系統的PATH環境變數(如果還沒加過)。 - 把上面的腳本存成該資料夾底下的
nvmuse.cmd。 - 開新的終端機視窗,之後改用以下指令切換版本即可:
nvmuse 20.20.2
如果指定的版本還沒安裝過,腳本會自動先執行 nvm install 幫你裝好,再進行切換,不用再手動分兩步操作。
補充說明
這個做法本質上是一個 workaround(繞過方案),並不是修好 nvm4w 本身的 bug,只是自己重新實作了「切版本」這個核心動作,讓它變得可靠。因為手法就是直接操作 junction,所以:
- Node.js 版本目錄本身仍然是由官方的
nvm install下載安裝管理,只有「切換」這個環節被取代。 - 如果日後 nvm4w 官方修好了這個 bug,直接刪除或不使用這支腳本、改回原生的
nvm use即可,不會有殘留設定的問題。
留言
張貼留言