はじめに(対象とゴール)
-
対象:Windows + WSL2(Ubuntu) で Node/Codex CLI などの最新ツールを動かしたい人
-
ゴール:
-
EBADENGINEを確実に回避 - 常にLTS(安定版)を使い続けられる運用(自動追従)を整備
-
-
想定作業時間:10〜20分
-
作業場所:WSL(Ubuntu)ターミナルのみ(PowerShellではなく、
Ubuntuと表示されたウィンドウ)
なぜ「LTS」なの?
Nodeは「Current → Active LTS → Maintenance」というライフサイクルで進み、本番運用はLTS推奨です。偶数メジャーがLTSへ移行します(22→LTS、24→2025-10-28にLTS移行予定)。(GitHub)
1. EBADENGINE の正体(まず理解)
-
EBADENGINE=npmが出す「指定エンジン(Nodeなど)に合わない」という警告/エラー。
例:package.jsonのengines.nodeが>=22なのに、手元の Node が 18 だと不一致で出ます。(docs.npmjs.com)
要点:Nodeが古いのが根本。最新LTSへ切り替えれば原則解決します。
2. すでに nvm がある人向け「最短2コマンド」
nvm install --lts # その時点のLTS(例:22系、LTS移行後は24系)を取得
nvm use --lts # いま使うNodeをLTSに切り替え
-
--lts:常に最新LTSを選ぶスイッチ(将来のLTS移行にも自動追従)。(GitHub)
確認
node -v # v22.x 以上(LTS移行後は v24.x 以上)
npm -v # npmのバージョンが出ればOK
3. ゼロから nvm を入れて LTS にする(手順と意味)
3-1. nvm をインストール(WSLのUbuntuで実行)
# nvm 公式インストールスクリプト(2025-10時点最新版)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
# 役割:~/.nvm に nvm を入れ、~/.bashrc 等へ読み込み行を追記
-
根拠:nvm公式READMEの手順。タグは
v0.40.3。(GitHub)
いま開いているシェルですぐ使えるよう、手動で読み込み:
export NVM_DIR="$HOME/.nvm" # nvmのホームを環境変数に設定
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # nvm本体をこのシェルに読み込む
補足:インストーラは
.bashrcにも追記しますが、すぐ使いたいので手動でsourceしています。(GitHub)
3-2. LTS を入れて使う
nvm install --lts # 最新LTSをダウンロード & インストール
nvm use --lts # 使うNodeをLTSへ切替(カレントシェル)
node -v # v22+(LTS移行後は v24+)を確認
npm -v # npmが出ればOK
-
用語:
- LTS=Long Term Support(長期サポート/安定版)
- Current=最新機能を取り込み中の現行版(のちにLTSへ)
- Maintenance=重要修正のみの保守段階
4. 新しいターミナルでも自動でLTSを選ぶ(恒久設定)
nvm alias default lts/*
# 意味:新規シェルを開くたびに "LTS" を既定として選択
- 根拠:nvm公式の「Set default node version」。(GitHub)
Tip:プロジェクト直下に
.nvmrcを置き、内容をlts/*にしておくと、
そのディレクトリではnvm useで自動的にLTSへ切替できます。(GitHub)
5. 動かないときの「3チェック」(原因切り分け)
# ① PATH と実体の確認
which node # 例)/home/<you>/.nvm/versions/node/v22.x/bin/node
node -v # v22.x 以上か(LTS移行後は v24.x 以上)
# ② nvm 自体が見えるか
command -v nvm # "nvm" と出ればOK
echo "$NVM_DIR" # 例)/home/<you>/.nvm
# ③ nvm の在庫と取得可能なLTS
nvm ls # インストール済み一覧(→が現在選択)
nvm ls-remote --lts # 取得できるLTSの一覧
よくある症状と対処
-
nvm: command not found
→~/.bashrcに nvm 読み込み行があるか確認。なければ追記して再読み込み:echo 'export NVM_DIR="$HOME/.nvm"' >> ~/.bashrc echo '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"' >> ~/.bashrc source ~/.bashrc(公式READMEのインストール節・Verifyに準拠)(GitHub)
-
which nodeが/usr/bin/nodeを指す(nvm管理下でない)
→ Windows側PATHの混入が原因のことあり。WSLのwsl.confで
WindowsのPATHを足さない設定にする:# /etc/wsl.conf(要sudoで編集) [interop] appendWindowsPath=false反映は
wsl --shutdown(PowerShell)→WSL再起動。(Microsoft Learn)
6. やらないほうがいいこと(落とし穴)
-
sudo npm -gの乱用
権限や配置が混在し、PATH事故の温床。nvm管理下のNodeで素のnpm -gを使うのが基本。
併せて、nvmはnpmのprefix設定と非互換である旨の注意がREADMEにあります。(GitHub) -
Windows側のNodeとWSLのNodeを混在させない
作業はWSLのUbuntuターミナルへ統一。必要ならappendWindowsPath=falseを活用。(Microsoft Learn) -
複数の入れ方をミックス(
apt+ 手動 + NodeSource など)
nvmに一本化しておくと、更新・PATHが一貫します。
7. トラブル復旧「最短レシピ」
# 1) このシェルで nvm を確実に読み込む
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
# 2) LTS を入れ直して選ぶ
nvm install --lts
nvm use --lts
# 3) 既定(default)を LTS に固定
nvm alias default lts/*
# 4) 動作確認
which node
node -v
npm -v
8. 参考:WSLでのNode運用の公式ガイド
- Microsoft Docs(WSLでのNode.js導入ガイド)。WSL2推奨の観点整理に有用。(Microsoft Learn)
-
WSLの詳細設定(wsl.conf/.wslconfig)。
appendWindowsPath=falseなどのキーの意味がまとまっています。(Microsoft Learn)
用語ミニ辞典
-
EBADENGINE:npmの警告/エラー。
package.jsonのengines定義とインストール環境のNodeバージョンが合わないと出る。(docs.npmjs.com) - LTS(Long Term Support):長期サポート版。安定運用向き。各バージョンの移行日程はRelease WGが管理。(GitHub)
- nvm:Node Version Manager。Nodeのバージョンを共存・即時切替できる。WSLでの利用も公式READMEに明記。(GitHub)
-
appendWindowsPath:WSLの設定キー。WindowsのPATHをWSLに足す/足さないを制御。混線回避に有効。(Microsoft Learn)
コマンド早見表
# nvm をインストール(公式・最新版タグを明示)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
# → ~/.nvm に nvm を配置し、シェル初期化ファイルへ読込行を追記(公式手順) :contentReference[oaicite:24]{index=24}
# いま開いているシェルに nvm を読み込む
export NVM_DIR="$HOME/.nvm" # nvm のホームを指す環境変数
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # nvm 本体を source してコマンドを有効化
# LTS(安定版)を入れて使う
nvm install --lts # 最新LTSを取得(将来のLTSに自動追従) :contentReference[oaicite:25]{index=25}
nvm use --lts # カレントシェルの Node を LTS に切替
node -v # v22+(LTS移行後は v24+)であることを確認 :contentReference[oaicite:26]{index=26}
npm -v # npm が応答すればOK
# 新しいターミナルでも自動で LTS を選ぶ
nvm alias default lts/* # 既定(default)エイリアスに LTS を設定 :contentReference[oaicite:27]{index=27}
# よく使う確認コマンド
which node # 実行される node のフルパス(nvm配下であることを確認)
nvm ls # インストール済み Node 一覧(→が現在選択)
nvm ls-remote --lts # 取得可能な LTS 一覧
# (必要に応じて)WSLの Windows PATH 混入を止める
# /etc/wsl.conf を編集し、以下を追記 → PowerShell で "wsl --shutdown" 後に再起動
# [interop]
# appendWindowsPath=false # WindowsのPATHをWSLに混ぜない :contentReference[oaicite:28]{index=28}
参考リンク
- nvm 公式README(Install/Usage/.nvmrc/alias default) (GitHub)
- Node.js Release Working Group:公式スケジュール(22=Active LTS、24=2025-10-28 LTS入り) (GitHub)
-
npm Docs:
package.jsonとenginesフィールドの解説 (docs.npmjs.com) - Microsoft Docs:WSLの設定(wsl.conf / appendWindowsPath) (Microsoft Learn)
- Microsoft Docs:WSLでのNode.js導入ガイド (Microsoft Learn)
以上で、EBADENGINEを根こそぎ潰す “LTS運用の土台” が整いました。
あとは各プロジェクトに.nvmrc(中身lts/*)を用意し、ディレクトリごとに自動切替できるようにしておくと、チーム開発でもトラブルが大幅に減ります。(GitHub)