できない.dev

npx が古いキャッシュ版を実行して最新バージョンにならない

npm 8 までの npx は一度実行したパッケージをキャッシュし、次回以降もキャッシュ版を使うため最新が反映されない。
@latest を付けて実行すれば最新を取得できる。
npm 9 以降は名前だけの実行でもレジストリの新しい版に入れ替わる。

公開: 更新:

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

要約

npm 8 までの npx pkg は、一度実行するとそのパッケージをキャッシュし、次回以降はレジストリを確認せずキャッシュ版を使います。

そのため新しいバージョンが公開されても、npx pkg を再実行しただけでは古い版が動き続けます。

最新を使いたいときは、pkg@latest のように明示します。
npm 9 以降は名前だけの npx pkg でもレジストリを確認し、新しい版があればキャッシュの中身を入れ替えます。

キャッシュ自体は起動を速くするための仕組みなので、毎回オンライン確認するとわずかに遅くなります。
常に最新が必要なツールだけ明示指定するのが現実的です。

実行例

npm 8.19.4 で npx の置き場に cowsay 1.5.0 が残っている状態にすると、名前だけの npx cowsay は --prefer-online を付けても 1.5.0 のままで、--ignore-existing は廃止のメッセージを出したうえで 1.5.0 を動かし、npm cache verify の後も変わりませんでした。cowsay@latest と明示すると 1.6.0 が動き、npm を 9.9.4 に上げると名前だけの npx cowsay でも 1.6.0 に入れ替わりました。

$ npx cowsay --version
1.5.0
$ npx --prefer-online cowsay --version
1.5.0
$ npx --ignore-existing cowsay --version
npx: the --ignore-existing argument has been removed.
See `npm help exec` for more information
1.5.0
$ npx cowsay@latest --version
npm WARN exec The following package was not found and will be installed: cowsay@1.6.0
1.6.0
$ npx cowsay --version
1.5.0
$ npm cache verify
Cache verified and compressed (~/.npm/_cacache)
Content verified: 63 (1326828 bytes)
Index entries: 63
Finished in 0.137s
$ npx cowsay --version
1.5.0
$ npm -v
8.19.4
$ npm install -g npm@9
removed 18 packages, and changed 104 packages in 6s
$ npm -v
9.9.4
$ npx cowsay --version
npm WARN exec The following package was not found and will be installed: cowsay@1.6.0
1.6.0

— 2026-09-30 時点の出力

検証環境

検証日
実行環境
node:16Debian GNU/Linux 10 (buster)
バージョン
  • Node.js 16.20.2
  • npm 8.19.4
  • Python 3.7.3
  • Git 2.20.1

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

よくある原因

  1. npm 8 までの npx が実行済みパッケージをキャッシュし、再実行時にレジストリを見ない。
  2. バージョン無指定で実行しており、キャッシュ版で十分と判断される。
  3. npm キャッシュに残った古い版が優先される。

解決策

1. バージョンを明示する

npx create-something@latest

@latest を付けると、キャッシュ版ではなくレジストリの最新を取得します。

2. npm のバージョンを確認する

npm -v

8 以下なら npm を 9 以降にします(npm は Node.js に同梱されているので、Node.js ごと更新するのが確実です)。
npm 8.19.4 ではキャッシュに古い版があると npx --prefer-online some-cli でも古い版のまま動きましたが、npm 9.9.4・10.8.2・11.17.0 では名前だけの npx some-cli でもレジストリの最新版に入れ替わりました。
なお --ignore-existing は npm 7 で廃止されたオプションで、付けても npx: the --ignore-existing argument has been removed. と表示されるだけで効果はありません(npx | npm Docs(新しいタブで開く) の「Compatibility with Older npx Versions」)。

3. npx の置き場を消して入れ直す

npm cache verify

npm cache verify が点検するのはダウンロード済みのパッケージを置く _cacache で、npx が実行したパッケージの置き場は変わりません。
npm 8.19.4 で確かめると、npm cache verify の後も npm cache clean --force の後も、名前だけの npx some-cli は古い版のまま動きました。
npx の置き場は npm のキャッシュディレクトリ(Linux と macOS の既定は ~/.npm)の下の _npx なので、このディレクトリを消すと、次の実行でレジストリの最新版が入り直します。

rm -rf ~/.npm/_npx

CI では毎回まっさらな環境になるため、ローカルだけで再現するなら npx キャッシュをまず疑うのが近道です。
フラグの詳細は公式の npx | npm Docs(新しいタブで開く) を参照してください。

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