できない.dev

nvm でバージョンを切り替えるとグローバルインストールした npm パッケージが使えない

nvm はバージョンごとに独立した lib/node_modules を持つため、切り替えると前のバージョンのグローバルパッケージは PATH から外れる。nvm reinstall-packages か --reinstall-packages-from で移送する。

公開: 更新:

実行例あり(2026-09-24 に実環境で検証)

要約

nvm use で Node.js を切り替えた途端に tsc: command not found のようになるのは、パッケージが消えたわけではありません。
nvm は バージョンごとに独立したグローバル領域 を持っており、切り替えると前のバージョンの lib/node_modules が PATH から外れるためです。

既にインストール済みのバージョン間で移送するなら、移送先を有効化してから nvm reinstall-packages を実行します。

nvm use 22.11.0
nvm reinstall-packages 20.11.0   # 20.11.0 のグローバルパッケージを 22.11.0 へ複製

新しいバージョンをこれから入れるなら、インストールと同時に移送できます。

nvm install --reinstall-packages-from=20 22

実行例

node:20 のコンテナに nvm で 20 と 22 を入れると、20 でグローバルに入れた typescript は nvm use 22 の後に tsc: command not found になり、npm ls -g --depth=0 の 22 側の一覧にも現れなかった。
22 を有効化して nvm reinstall-packages 20 を実行すると tsc が使えるようになり、~/.npmrc に prefix を残した状態では nvm use 22 そのものが拒否される。

$ nvm use 20; npm install -g --no-audit --no-fund typescript; tsc -v
Now using node v20.20.2 (npm v10.8.2)
 
added 2 packages in 1s
Version 7.0.2
$ nvm use 22; tsc -v
Now using node v22.23.3 (npm v10.9.9)
bash: line 1: tsc: command not found
$ nvm use 20; npm ls -g --depth=0
Now using node v20.20.2 (npm v10.8.2)
/root/.nvm/versions/node/v20.20.2/lib
+-- corepack@0.34.6
+-- npm@10.8.2
`-- typescript@7.0.2
$ nvm use 22; npm ls -g --depth=0
Now using node v22.23.3 (npm v10.9.9)
/root/.nvm/versions/node/v22.23.3/lib
+-- corepack@0.36.0
`-- npm@10.9.9
$ nvm use 22; nvm reinstall-packages 20
Now using node v22.23.3 (npm v10.9.9)
Reinstalling global packages from v20.20.2...
 
added 2 packages in 505ms
Linking global packages from v20.20.2...
No linked global packages found...
$ nvm use 22; tsc -v; nvm which current
Now using node v22.23.3 (npm v10.9.9)
Version 7.0.2
/root/.nvm/versions/node/v22.23.3/bin/node
$ nvm use 22
Your user’s .npmrc file (${HOME}/.npmrc)
has a `globalconfig` and/or a `prefix` setting, which are incompatible with nvm.
Run `nvm use --delete-prefix v22.23.3` to unset it.
$ grep -n 'prefix' ~/.npmrc
1:prefix=/root/.npm-global
$ nvm use 22; npm config get prefix
Now using node v22.23.3 (npm v10.9.9)
/root/.nvm/versions/node/v22.23.3

— 2026-09-24 時点の出力

検証環境

検証日
実行環境
node:20Debian GNU/Linux 12 (bookworm)
バージョン
  • Node.js 20.20.2
  • npm 10.8.2
  • Python 3.11.2
  • Git 2.39.5

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

よくある原因

  1. グローバル領域がバージョンごとに分かれている: 実体は ~/.nvm/versions/node/<version>/lib/node_modules です。nvm which current でどの bin が使われているかを確認できます。
  2. 移送コマンドを打っていない: nvm install 22 は新しい Node を入れるだけで、旧バージョンのパッケージを引き継ぎません。
  3. ~/.npmrc の prefix が残っている: 過去にグローバルインストール先を手動で変えていると、nvm の想定するパスと食い違います。
    公式 README も prefix 設定は nvm と非互換だと注意しています。
  4. システム Node と混同している: /usr/local/lib/node_modules に入れたパッケージは nvm の管理外です。nvm deactivate で PATH を戻すと切り分けられます。

解決策

1. インストール済みバージョン間で移送する

--reinstall-packages-from は nvm install に紐づいたオプションなので、既に入っているバージョン同士では使えません。
この場合は移送先を有効化してから nvm reinstall-packages を単体で実行します。

nvm ls                    # 移送元・移送先のバージョンを確認
nvm use 22.11.0           # 移送先を有効化
nvm reinstall-packages 20.11.0

なお 公式ドキュメント(新しいタブで開く) にあるとおり、この操作で npm 自体のバージョンは変わりません。

2. インストールと同時に移送する

これから新しいバージョンを入れるなら、1 コマンドで済みます。

nvm install --reinstall-packages-from=20 22
nvm install --reinstall-packages-from=current 'lts/*'   # 現在有効なバージョンから最新 LTS へ

npm も最新にしたい場合は --latest-npm を併用します。

3. .npmrc の prefix を確認する

npm config get prefix
grep -n 'prefix' ~/.npmrc 2>/dev/null

prefix が ~/.nvm/versions/node/... 以外を指していたら、その行を削除して新しいシェルを開き直します。

4. 何が欠けたのかを比較する

切り替え前後で一覧を取って差分を見ると、移送漏れがすぐ分かります。

npm ls -g --depth=0

出力に自分が使っている CLI(typescript、pnpm など)が含まれているかを確認してください。

この記事は役立ちましたか?