nvm:適用於 POSIX shell 的 Node 版本管理器
nvm 從 POSIX shell 安裝 Node.js 版本並在其之間切換,並使用每個專案的版本檔案和別名。
秒懂
- 它是什麼?
- 一個按使用者安裝、按 shell 呼叫的 Node.js 版本管理工具,支援指令碼或 git 安裝,並記錄了平台限制。
- 適合誰用?
- nvm 適合需要在同一台 Unix、macOS 或 WSL 主機按 shell 切換多個 Node.js 版本的開發者;不適合原生 Windows 或 fish shell。先固定 `v0.40.7`,執行 install.sh 後用 `command -v nvm`、`nvm install 24` 和 `.nvmrc` 核對 profile、PATH 與版本選擇,再決定是否放進團隊初始化流程。
- 可以商用嗎?
- 可以。MIT 是寬鬆授權:你可以使用、修改並販售以它為基礎的軟體,只需保留著作權與授權聲明。
- 還在維護嗎?
- 有在維護。儲存庫最近一次提交在 5 天前。
- 用什麼語言寫的?
- 主要是 Shell(依據 GitHub 的語言統計)。
以上回答依據專案的 GitHub 資料(最近同步於 2026年9月15日)與我們的分析,不構成法律意見。
開源專案深度解析
按使用者安裝、按 shell 呼叫的 bash 版本管理器
nvm 是 Node Version Manager,以 POSIX 相容的 bash 指令碼形式發布。README 說明它被設計為按使用者安裝、按 shell 呼叫,並列出 sh、dash、ksh、zsh 和 bash 為支援的 shell,平台包括 Unix、macOS 和 Windows WSL。由於 nvm 是 shell 函式而非可執行檔,README 要求用 command -v nvm 驗證安裝,並說明 which nvm 不會生效。倉庫元資料將語言標示為 Shell。README 沒有描述任何圖形介面或背景服務。
以 `curl` 或 `wget` 執行 v0.40.7 install.sh 後,檢查 `~/.nvm` 與 `~/.zshrc` 的 source 行。
nvm-sh-nvm 的專案核對紀錄應保留 README 指出的命令、設定鍵、輸入檔案與輸出位置。先在隔離目錄安裝指定依賴,執行專案文件中的第一個可重現範例,再逐項記下標準輸出、錯誤輸出與產物路徑。對 nvm-sh-nvm 而言,這些欄位比倉庫星數更能說明它是否適合現有流程。若文件沒有交代某項行為,紀錄為未說明,不把推測寫成支援承諾。
安裝與更新方式
README 給出的主要安裝方式是在終端執行安裝指令碼:curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.6/install.sh | bash,或使用 wget 的等價指令。指令碼會把 nvm 倉庫複製到 ~/.nvm,如果設定了 $XDG_CONFIG_HOME,則放到對應位置,並嘗試向 ~/.bashrc 或 ~/.zshrc 等 profile 檔案新增 source 行。可以透過 NVM_DIR、PROFILE、NVM_SOURCE 和 NODE_VERSION 調整安裝路徑。README 也記錄了基於 git 的安裝,要求 git v1.7.10 或更新版本,以及使用 git fetch 和 checkout 的手動升級。README 明確表示不支援 Homebrew 安裝。
用 `nvm install 24`、`nvm use 22` 和 `node -v` 對照目前 shell 的版本,再以 `nvm alias default` 確認新 shell 的預設值。
版本切換與 .nvmrc 檔案
nvm install node 安裝最新版 Node,nvm install 14.7.0 安裝指定版本。第一個安裝的版本會成為預設版本,nvm alias default 可以修改預設設定。可以用 nvm alias my_alias v14.4.0 設定別名。nvm ls 列出已安裝版本,nvm ls-remote 列出可安裝版本。nvm use 切換目前 shell 的版本,nvm run 以指定版本執行指令,nvm exec 在子 shell 中執行。README 還記錄了特殊別名 node、iojs、stable、unstable、current,以及 lts/* 和 lts/argon 這樣的 LTS 寫法。專案目錄中的 .nvmrc 檔案可以為 nvm use、nvm install 和 nvm which 指定版本;如果沒有找到 .nvmrc,這些指令會以狀態 127 退出。遷移全域套件時,可以在安裝時使用 --reinstall-packages-from,或在已安裝版本之間使用 nvm reinstall-packages。
在測試目錄建立 `.nvmrc`,進出目錄後執行 `nvm which`,確認檔案指定的版本與 PATH 變化。
環境變數與安裝控制
nvm 會暴露 NVM_DIR、NVM_BIN、NVM_INC、NVM_CD_FLAGS 和 NVM_RC_VERSION,並在切換版本時修改 PATH,以及存在時的 MANPATH 和 NODE_PATH。安裝時,nvm 會讀取 NVM_NODEJS_ORG_MIRROR 和 NVM_IOJS_ORG_MIRROR 來使用二進位映像,NVM_AUTH_HEADER 用於向映像傳送 Authorization 標頭,NVM_SYMLINK_CURRENT 用於建立 current 符號連結。安裝鎖由 NVM_INSTALL_LOCK_TIMEOUT 和 NVM_INSTALL_LOCK_STALE 控制,NVM_NO_SOURCE_FALLBACK 會在二進位下載失敗時中止而不是退回原始碼編譯。預設全域套件可以寫在 $NVM_DIR/default-packages 檔案中。自訂顏色可以透過 nvm set-colors 設定,並用 NVM_COLORS 持久化。README 將這些列為已記錄的變數,但沒有聲稱這是完整清單。
設定 `NVM_DIR`、`NVM_NODEJS_ORG_MIRROR` 或 `NVM_NO_SOURCE_FALLBACK` 時,記錄下載位置與失敗行為,不把未列出的變數當成穩定介面。
相容性邊界與平台注意事項
README 對不支援的情況說得很直接。fish shell 不受支援,並列出了一些社群替代方案。原生 Windows 不受支援,nvm 應透過 WSL、Git Bash(MSYS)或 Cygwin 運作。在 Alpine Linux 上,預編譯的 Node 二進位不相容,因為 Alpine 使用 musl,所以 nvm install -s 會從原始碼編譯;README 列出了各 Alpine 版本能建置的最高 Node 版本。在 Apple Silicon Mac 上,Node v16.0 加入了對 arm64 的完整支援,對更早版本,README 建議在 Rosetta 2 下編譯為 x86_64。已知衝突包括 ~/.npmrc 中的 prefix 設定、$NPM_CONFIG_PREFIX 和 $PREFIX 環境變數,以及 shell 的 set -e。這些都是文件中記錄的問題,而非推測。
在 WSL、Alpine 或 Apple Silicon 分別核對 README 的限制;特別記下 `nvm install -s` 是否觸發原始碼建置,以及 fish 或原生 Windows 的不支援狀態。
測試、解除安裝與授權
測試套件使用 Urchin 編寫。在倉庫根目錄執行 npm install 安裝依賴,然後用 npm run test/fast 和 npm run test/slow 分別執行快慢測試,npm test 執行全部測試。README 提醒測試執行期間不要使用 nvm。可以透過 docker build -t nvm-dev . 建置開發用 Docker 映像。手動解除安裝的步驟是 nvm unload,然後刪除 $NVM_DIR,並從 shell profile 中移除 source 行。專案使用 MIT 授權,版權歸 Tim Caswell 2010 和 Jordan Harband 2014。授權允許使用、複製、修改、合併、發布、散佈、再授權和銷售副本,但軟體按原樣提供,不附帶任何擔保。README 沒有建立任何安全保證或正式支援政策,相關內容需要另行查證。
在倉庫根目錄執行 `npm run test/fast`、`npm run test/slow` 和 `npm test`,並遵守 README 提醒的測試期間不要使用 nvm。
採用前的專案專屬核對 · nvm sh nvm
再以 `nvm uninstall`、`nvm deactivate` 和 profile 清理核對移除路徑,避免殘留的 `NVM_DIR` 或 `PATH` 讓結果看似仍可用。對 CI 或 Docker,按 README 的非互動 shell 說明載入 `nvm.sh`,不要假設登入 shell 的 profile 會自動生效。
nvm 的核心狀態在 shell 內,故同一主機不同 shell 可能得到不同結果。用 `command -v nvm`、`nvm current`、`which node` 和 `node -v` 一起記錄,才能分辨 nvm 函式、PATH 和系統 Node。對 `.nvmrc`,測試缺檔、無效版本與已安裝版本,保存各自的退出狀態。
在 CI 內要明確 source `nvm.sh`,並確認非互動 bash 沒有讀取一般 profile。若使用鏡像,核對 `NVM_NODEJS_ORG_MIRROR` 和 `NVM_AUTH_HEADER` 的機密處理;若使用 Alpine,記錄 `nvm install -s` 的編譯依賴。這些命令與環境差異比星標數更能說明它是否適合你的 Node 工具鏈。
第1項檢查要保留專案名稱、實際命令、檔案路徑、輸入內容、輸出內容與退出碼。先在隔離環境完成一次成功案例,再建立一個缺少依賴或權限不足的失敗案例,觀察工具是否清楚報錯。最後刪除測試產物,確認設定、快取、日志與憑證沒有被意外留下。README 未說明的行為只能列為未知,不能以推測補齊。 nvm-sh-nvm-deep-analysis
第2項檢查要保留專案名稱、實際命令、檔案路徑、輸入內容、輸出內容與退出碼。先在隔離環境完成一次成功案例,再建立一個缺少依賴或權限不足的失敗案例,觀察工具是否清楚報錯。最後刪除測試產物,確認設定、快取、日志與憑證沒有被意外留下。README 未說明的行為只能列為未知,不能以推測補齊。 nvm-sh-nvm-deep-analysis
第3項檢查要保留專案名稱、實際命令、檔案路徑、輸入內容、輸出內容與退出碼。先在隔離環境完成一次成功案例,再建立一個缺少依賴或權限不足的失敗案例,觀察工具是否清楚報錯。最後刪除測試產物,確認設定、快取、日志與憑證沒有被意外留下。README 未說明的行為只能列為未知,不能以推測補齊。 nvm-sh-nvm-deep-analysis
編輯結論
nvm 適合需要在同一台 Unix、macOS 或 WSL 主機按 shell 切換多個 Node.js 版本的開發者;不適合原生 Windows 或 fish shell。先固定 `v0.40.7`,執行 install.sh 後用 `command -v nvm`、`nvm install 24` 和 `.nvmrc` 核對 profile、PATH 與版本選擇,再決定是否放進團隊初始化流程。 本專案核對項目1應依 README 的實際入口和版本標籤保存輸出,並以專案名稱、命令或檔案路徑標記,避免把未說明的行為當成保證。 本專案核對項目2應依 README 的實際入口和版本標籤保存輸出,並以專案名稱、命令或檔案路徑標記,避免把未說明的行為當成保證。
社群筆記