星期日, 10月 12, 2025

Ubuntu 24.04 LTS 使用 NVM 安裝 node.js 版本小記

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


以下是 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