Ubuntu 24.04 LTS 使用 NVM 安裝 node.js 版本小記
OS: Ubuntu 24.04 LTS on GCP
目前 Gemini CLI 版本升級的很快 (寫文章當下為 0.8.2), 需求的 Node.js 版本也從之前的 18 修改為 20 以上的版本
今天寫這篇 Blog 就是紀錄如何調整 Ubuntu 24.04 LTS node.js 版本
以目前 Ubuntu 24.04 LTS 預設的 node.js 18 是無法執行 Gemini CLI
如果詢問 Gemini CLI 如何升級 Ubuntu 24.04 的 Node.js 版本,他可能會首推 nvm
如果在 node.js 下載的頁面 https://nodejs.org/en/download 上, 你也會看到 nvm 會放在預設選項
以下是 nvm 說明 (取自 Gemini CLI)
nvm (Node Version Manager) 是一個非常實用的命令列工具,它允許您在同一台電腦上安裝和管理多個不同的 Node.js 版本。
nvm 是一個 shell 腳本,它不會汙染您系統原生的套件管理器(如 apt 或 brew)。它將 Node.js 版本安裝在您的家目錄 (~/.nvm) 下的一個子目錄中,並透過修改您的 PATH 環境變數來讓您輕鬆切換要使用的版本。
nvm 的主要優點
版本隔離:您可以在電腦上同時擁有 Node.js v16, v18, v20 等多個版本,並為不同的專案指定不同的版本。
輕鬆切換:只需一個簡單的指令,就可以在幾秒鐘內切換當前終端機 (terminal) 工作階段所使用的 Node.js 版本。
無需 sudo:因為 Node.js 和全域安裝的 npm 套件都儲存在您的家目錄下,所以在執行 npm install -g <package> 時不再需要 sudo 權限,避免了潛在的權限問題。
方便測試:您可以輕易地測試您的應用程式在不同 Node.js 版本下的相容性。
專案版本鎖定:透過在專案根目錄下建立一個 .nvmrc 檔案,團隊成員可以自動同步並使用專案指定的 Node.js 版本。
安裝 nvm
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
讓 nvm 指令生效
$ source ~/.bashrc
可以觀察 ~/.bashrc 內容
列出所有可安裝的遠端版本
$ nvm ls-remote
$ nvm ls-remote | grep 'Latest LTS'
v4.9.1 (Latest LTS: Argon)
v6.17.1 (Latest LTS: Boron)
v8.17.0 (Latest LTS: Carbon)
v10.24.1 (Latest LTS: Dubnium)
v12.22.12 (Latest LTS: Erbium)
v14.21.3 (Latest LTS: Fermium)
v16.20.2 (Latest LTS: Gallium)
v18.20.8 (Latest LTS: Hydrogen)
v20.19.5 (Latest LTS: Iron)
v22.20.0 (Latest LTS: Jod)
列出已安裝版本
$ nvm ls
N/A
iojs -> N/A (default)
node -> stable (-> N/A) (default)
unstable -> N/A (default)
lts/* -> lts/jod (-> N/A)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.12 (-> N/A)
lts/fermium -> v14.21.3 (-> N/A)
lts/gallium -> v16.20.2 (-> N/A)
lts/hydrogen -> v18.20.8 (-> N/A)
lts/iron -> v20.19.5 (-> N/A)
lts/jod -> v22.20.0 (-> N/A)
目前尚未安裝
安裝最新穩定版 (LTS)
$ nvm install --lts
Installing latest LTS version.
Downloading and installing node v22.20.0...
Downloading https://nodejs.org/dist/v22.20.0/node-v22.20.0-linux-x64.tar.xz...
###################################################################################################################################### 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v22.20.0 (npm v10.9.3)
Creating default alias: default -> lts/* (-> v22.20.0)
再次觀察
$ nvm ls
-> v22.20.0
default -> lts/* (-> v22.20.0)
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v22.20.0) (default)
stable -> 22.20 (-> v22.20.0) (default)
lts/* -> lts/jod (-> v22.20.0)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.12 (-> N/A)
lts/fermium -> v14.21.3 (-> N/A)
lts/gallium -> v16.20.2 (-> N/A)
lts/hydrogen -> v18.20.8 (-> N/A)
lts/iron -> v20.19.5 (-> N/A)
lts/jod -> v22.20.0
這邊可以觀察到使用中與預設都設定為 22.20.0
$ node -v
v22.20.0
$ npm -v
10.9.3
安裝特定版本
$ nvm install 20.10.0
Downloading and installing node v20.10.0...
Downloading https://nodejs.org/dist/v20.10.0/node-v20.10.0-linux-x64.tar.xz...
###################################################################################################################################### 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v20.10.0 (npm v10.2.3)
再次觀察
$ nvm ls
-> v20.10.0
v22.20.0
default -> lts/* (-> v22.20.0)
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v22.20.0) (default)
stable -> 22.20 (-> v22.20.0) (default)
lts/* -> lts/jod (-> v22.20.0)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.12 (-> N/A)
lts/fermium -> v14.21.3 (-> N/A)
lts/gallium -> v16.20.2 (-> N/A)
lts/hydrogen -> v18.20.8 (-> N/A)
lts/iron -> v20.19.5 (-> N/A)
lts/jod -> v22.20.0
觀察使用中箭頭 已經指向 v20.10.0
指令觀察 node -v / npm -v 也換成相對應的版本
安裝最新的 node.js 20 版本
$ nvm install 20
Downloading and installing node v20.19.5...
Downloading https://nodejs.org/dist/v20.19.5/node-v20.19.5-linux-x64.tar.xz...
###################################################################################################################################### 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v20.19.5 (npm v10.8.2)
nvm alias default 20
觀察資訊
$ nvm ls
v20.10.0
-> v20.19.5
v22.20.0
default -> lts/* (-> v22.20.0)
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v22.20.0) (default)
stable -> 22.20 (-> v22.20.0) (default)
lts/* -> lts/jod (-> v22.20.0)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.12 (-> N/A)
lts/fermium -> v14.21.3 (-> N/A)
lts/gallium -> v16.20.2 (-> N/A)
lts/hydrogen -> v18.20.8 (-> N/A)
lts/iron -> v20.19.5
lts/jod -> v22.20.0
切換 node.js 版本
$ nvm use 22.20.0
Now using node v22.20.0 (npm v10.9.3)
觀察資訊
$ nvm ls
v20.10.0
v20.19.5
-> v22.20.0
default -> lts/* (-> v22.20.0)
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v22.20.0) (default)
stable -> 22.20 (-> v22.20.0) (default)
lts/* -> lts/jod (-> v22.20.0)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.12 (-> N/A)
lts/fermium -> v14.21.3 (-> N/A)
lts/gallium -> v16.20.2 (-> N/A)
lts/hydrogen -> v18.20.8 (-> N/A)
lts/iron -> v20.19.5
lts/jod -> v22.20.0
設定預設版本
$ nvm alias default 20
default -> 20 (-> v20.19.5)
所謂的預設版本就是開了終端機, 預設會使用的 node.js 版本
觀察資訊
$ nvm ls
v20.10.0
v20.19.5
-> v22.20.0
default -> 20 (-> v20.19.5)
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v22.20.0) (default)
stable -> 22.20 (-> v22.20.0) (default)
lts/* -> lts/jod (-> v22.20.0)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.12 (-> N/A)
lts/fermium -> v14.21.3 (-> N/A)
lts/gallium -> v16.20.2 (-> N/A)
lts/hydrogen -> v18.20.8 (-> N/A)
lts/iron -> v20.19.5
lts/jod -> v22.20.0
補充 .nvmrc 進行版本管理
在專案目錄下如果有 .nvmrc 檔案, 在檔案中可以寫入想使用的 node.js 版本, 例如 20.10.0
如果版本已安裝, 可以使用 nvm use 指令去搜尋是否有 .nvmrc 檔案並切換到該版本
如果版本未安裝, 可使用 nvm install 來進行安裝
==== 同場加映 使用 apt 方式 調整系統 node.js 版本 ====
在大部分的時候, 如果是新的系統, 我可能還是會採取 apt 方式來調整系統的 node.js 版本
原因為
nvm 適合開發人員使用, 他安裝的路徑都是在個人家目錄 (~/.nvm/versions/node), 也就是說只對個人有效
系統未必知道相關設定, 例如 cron job, 所以如果執行 cron job 可能還是使用 node.js 18.x 版本, 也許會產生錯誤
以下紀錄使用 nodesource 來源 增加 node.js 20 版本方式
安裝相關套件
$ sudo apt update && sudo apt install -y ca-certificates curl gnupg
建立 key 使用目錄
$ sudo mkdir -p /etc/apt/keyrings
取得 gpg key
$ curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
設定要使用的 node.js 版本
$ NODE_MAJOR=20
新增 repo
$ echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
執行 apt update
$ sudo apt update
安裝 node.js
$ sudo apt install nodejs -y
驗證安裝
$ node -v
$ npm -v
這樣又往前一步
~ enjoy it