普段はasdfでNode.jsを管理しているのですが、.tool-versions のバージョンが上がって asdf install するたびに、それまで使えていたpnpmが使えなくなります。
毎回対処法を思い出すところから始めているので、原因の仕組みと合わせてメモしておきます。
発生した状況
プロジェクトの .tool-versions には新しいNode.jsのバージョンが指定されています。
nodejs 24.17.0
asdf install でNode.js自体は問題なくインストールでき、node --version も新しいバージョンを返します。
ところが pnpm を実行すると、次のようなエラーになります。
$ pnpm --version
No version is set for command pnpm
Consider adding one of the following versions in your config file at /path/to/project/.tool-versions
nodejs 24.13.0
nodejs 22.18.0
...
asdfのpnpmプラグインは入れておらず、corepack経由でpnpmを使っている環境です。
原因
結論から言うと、corepackで有効化したpnpmはNode.jsのバージョンごとに独立して存在するためです。
corepack enable pnpm を実行すると、そのとき有効になっているNode.jsのbinディレクトリにpnpmのシンボリックリンクが作られます。
$ ls ~/.asdf/installs/nodejs/24.13.0/bin/
corepack node npm npx pnpm pnpx
$ ls ~/.asdf/installs/nodejs/24.17.0/bin/
corepack node npm npx # ← 新しいバージョンにはpnpmがない
一方、asdfのshimは「カレントディレクトリでアクティブなNode.jsバージョンのbin」から実行ファイルを探します。
~/.asdf/shims/pnpm というshim自体は過去に作られているので存在しますが、.tool-versions が指す24.17.0のbinにpnpmの実体がないため、冒頭のエラーになるわけです。
エラーメッセージが「古いバージョンを .tool-versions に追加しては?」という提案になっているのは、pnpmの実体を持っているNode.jsのバージョンを列挙しているからです。
これに従って古いバージョンに戻すのは本末転倒なので、新しいバージョン側にpnpmを入れてあげます。
対処法
プロジェクトのディレクトリで次の2つを実行するだけです。
corepack enable pnpm
asdf reshim nodejs
corepack enable pnpm で、アクティブなNode.jsバージョンのbinにpnpmのシンボリックリンクが作られます。
続けて asdf reshim nodejs でshimを再生成すれば完了です。
$ pnpm --version
11.4.0
プロジェクトの package.json に packageManager フィールドが設定されていれば、corepackがそのバージョンのpnpmを自動でダウンロードして使ってくれます。
{
"packageManager": "pnpm@11.4.0"
}
そもそもasdfで管理した方がいいかも
とはいえ、Node.jsを上げるたびにこの2コマンドを打つのは正直面倒です。 個人的には、asdfのpnpmプラグインでpnpm自体を管理してしまう方がいいかなと思っています。
asdf plugin add pnpm
asdf install pnpm 11.4.0
.tool-versions にNode.jsと並べて書けるので、Node.jsのバージョンを上げてもpnpmは消えません。
nodejs 24.17.0
pnpm 11.4.0
もう1つの理由として、Node.js 25以降はcorepackが本体に同梱されなくなりました。
25以降ではcorepack自体を npm install -g corepack で入れ直すところから始まるので、corepack運用の手間は今後むしろ増えていきます。
この記事の対処法がそのまま使えるのも、corepackが同梱されている24系までという点には注意してください。
一点、チームやCIがcorepackと packageManager フィールド前提で動いているプロジェクトでは、自分だけasdfに寄せると .tool-versions と packageManager の二重管理になってしまいます。
そういうプロジェクトではcorepack運用のまま、この記事の対処法で乗り切るのが無難だと思います。
まとめ
corepack経由のpnpmはNode.jsのバージョンごとに有効化が必要です。
asdfで新しいNode.jsを入れてpnpmが見つからなくなったら、corepack enable pnpm と asdf reshim nodejs の2コマンドを実行する、と覚えておけば大丈夫です。
Node.jsを上げるたびに面倒だなと感じたら、asdfのpnpmプラグインへの移行も検討してみてください。
npmで npm install -g したツールが新しいバージョンで消えるのと同じ構造なので、Node.jsのバージョンを上げたときにコマンドが見つからなくなったら試してみてください。