【逐次移行が良さそう】Volta管理のpnpmを削除してcorepack管理に移行したい
まとめ
Volta管理のpnpm削除方法
pnpm関係のディレクトリ削除
~/.volta/tools/image/pnpm
~/.volta/tools/image/packages/pnpm
~/.volta/tools/inventory/pnpm
~/.volta/tools/shared/pnpm
-
~/.volta/tools/user/bins
(pnpm以外があれば配下を個別に消す) -
~/.volta/tools/user/packages
(pnpm以外があれば配下を個別に消す)
platform.json
の修正
~/.volta/tools/user/platform.json
というファイルからpnpmを削除する
{
"node": {
"runtime": "20.11.1",
"npm": null
},
- "pnpm": "8.13.1",
"yarn": "1.22.19"
}
corepackの有効化
$ volta install corepack
$ corepack enable --install-directory ~/.volta/bin
これでcorepackのpnpmでpnpm ~
ができる
Volta管理のプロジェクトへのcorepack適用
packageManager
フィールドがないプロジェクトには勝手に追加してくれたので、volta.pnpm
フィールドを削除してpnpm ~
を動かせば問題ないと考えている
{
...
"volta": {
"node": "20.14.0"
- "pnpm": "8.13.1",
},
...
+ "packageManager": "pnpm@9.1.4+sha512.9df9cf27c91715646c7d675d1c9c8e41f6fce88246f1318c1aa6a1ed1aeb3c4f032fcdf4ba63cc69c4fe6d634279176b5358727d8f2cc1e65b65f43ce2f8bfb0"
}
CI適用についても書きたかったが、これを読めば問題なく適用できるはずなので、これを読んでほしい
なぜ移行したいのか
- corepackを有効化することで、
pnpm/action-setup
を使わずにactions/setup-node
のみに依存を絞れるため - corepackはNode.jsパッケージマネージャーの新しい管理方法であり、取り入れたほうが今後の利益になるため
- Voltaの最新更新が現時点で2023年の1月と1年以上更新がなく、今後別のパッケージマネージャー管理ツールに移行する可能性もあるため
volta uninstall pnpm
はなぜ動作しないのか
Voltaにはuninstall
サブコマンドが存在するが、pnpmをuninstall
しようとすると以下のような表示が出て実行されない
error: Uninstalling pnpm is not supported yet.
これは、現時点でVoltaのuninstallのほとんどがSpecとして実装されており、すべてパッケージのuninstall
以外では未実装としてエラーが返ってくるため
一部の記事ではvolta uninstall pnpm
として紹介されているが、Volta自体がpnpmを管理している場合は手動で削除する必要がある
参考資料
実行環境は以下
$ uname -sr
Linux 5.15.146.1-microsoft-standard-WSL2
$ node -v
v20.14.0
手動で~/.volta
配下を探し回り、以下のような流れで削除した
$ ls ~/.volta/tools/image/
node npm packages pnpm yarn
$ ls ~/.volta/tools/image/pnpm
7.26.1 7.26.2 7.27.1 7.29.3 7.30.0 8.12.1 8.13.1 8.15.6 8.15.8 8.6.11 8.6.12 8.6.3 8.6.5 8.6.7 8.7.6 9.1.1 9.1.4
$ rm -rf ~/.volta/tools/image/pnpm
$ ls ~/.volta/tools/image/pnpm
ls: '/home/windchime-yk/.volta/tools/image/pnpm' にアクセスできません: そのようなファイルやディレクトリはありません
$ ls ~/.volta/tools/image/
node npm packages yarn
$ ls ~/.volta/tools/inventory/
node npm pnpm yarn
$ ls ~/.volta/tools/inventory/pnpm/
pnpm-7.26.1.tgz pnpm-7.27.1.tgz pnpm-7.30.0.tgz pnpm-8.13.1.tgz pnpm-8.15.8.tgz pnpm-8.6.12.tgz pnpm-8.6.5.tgz pnpm-8.7.6.tgz pnpm-9.1.4.tgz
pnpm-7.26.2.tgz pnpm-7.29.3.tgz pnpm-8.12.1.tgz pnpm-8.15.6.tgz pnpm-8.6.11.tgz pnpm-8.6.3.tgz pnpm-8.6.7.tgz pnpm-9.1.1.tgz
$ rm -rf ~/.volta/tools/inventory/pnpm/
$ ls ~/.volta/tools/inventory/
node npm yarn
$ volta list
⚡️ Currently active tools:
Node: v20.14.0 (current @ /home/windchime-yk/dev/private/chalog/package.json)
pnpm: v9.1.4 (current @ /home/windchime-yk/dev/private/chalog/package.json)
Yarn: v1.22.19 (default)
Tool binaries available:
pnpm, pnpx (default)
See options for more detailed reports by running `volta list --help`.
$ volta list
⚡️ Currently active tools:
Node: v20.14.0 (current @ /home/windchime-yk/dev/private/chalog/package.json)
pnpm: v8.13.1 (default)
Yarn: v1.22.19 (default)
Tool binaries available:
pnpm, pnpx (default)
See options for more detailed reports by running `volta list --help`.
$ ls ~/.volta/tools/
image inventory shared user
$ ls ~/.volta/tools/shared/
corepack pnpm
$ ls ~/.volta/tools/shared/pnpm
LICENSE README.md bin dist package.json
$ rm -rf ~/.volta/tools/shared/pnpm
$ ls ~/.volta/tools/shared/
corepack
$ ls ~/.volta/tools/shared/pnpm
ls: '/home/windchime-yk/.volta/tools/shared/pnpm' にアクセスできません: そのようなファイルやディレクトリはありません
$ ls ~/.volta/tools/shared/
corepack
$ ls ~/.volta/tools/
image inventory shared user
$ ls ~/.volta/tools/user/
bins packages platform.json
$ vi ~/.volta/tools/user/platform.json
$ ls ~/.volta/tools/user/
bins packages platform.json
$ ls ~/.volta/tools/user/bin
ls: '/home/windchime-yk/.volta/tools/user/bin' にアクセスできません: そのようなファイルやディレクトリはありません
$ ls ~/.volta/tools/user/bins
pnpm.json pnpx.json
$ rm -rf ~/.volta/tools/user/bins
$ ls ~/.volta/tools/user/
packages platform.json
$ ls ~/.volta/tools/user/packages/
pnpm.json
$ rm -rf ~/.volta/tools/user/packages/
$ ls ~/.volta/tools/user/packages/
ls: '/home/windchime-yk/.volta/tools/user/packages/' にアクセスできません: そのようなファイルやディレクトリはありません
$ ls ~/.volta/tools/user/
platform.json
$ ls ~/.volta/tools/
image inventory shared user
$ ls ~/.volta/tools/image/
node npm packages yarn
$ ls ~/.volta/tools/image/packages/
corepack pnpm
$ rm -rf ~/.volta/tools/image/packages/pnpm/
$ ls ~/.volta/tools/image/packages/
corepack
$ ls ~/.volta/tools/
image inventory shared user
$ ls ~/.volta/tools/inventory/
node npm yarn
$ volta list
⚡️ Currently active tools:
Node: v20.14.0 (current @ /home/windchime-yk/dev/private/chalog/package.json)
Yarn: v1.22.19 (default)
Tool binaries available: NONE
See options for more detailed reports by running `volta list --help`.
順番がグチャグチャなので、整理しつつ確認する
削除対象のディレクトリ
~/.volta/tools/image/pnpm
~/.volta/tools/image/packages/pnpm
~/.volta/tools/inventory/pnpm
~/.volta/tools/shared/pnpm
-
~/.volta/tools/user/bins
(pnpm以外があれば配下を個別に消す) -
~/.volta/tools/user/packages
(pnpm以外があれば配下を個別に消す)
これらを削除してもvolta list
では表示されると思うので、platform.json
を修正する
platform.json
の修正
~/.volta/tools/user/platform.json
というファイルがあり、おそらくここがvolta list
で参照するファイルと思われる
{
"node": {
"runtime": "20.11.1",
"npm": null
},
"pnpm": "8.13.1",
"yarn": "1.22.19"
}
ここも削除を行なう
{
"node": {
"runtime": "20.11.1",
"npm": null
},
- "pnpm": "8.13.1",
+
"yarn": "1.22.19"
}
出力確認
$ volta list
⚡️ Currently active tools:
Node: v20.14.0 (current @ /home/windchime-yk/dev/private/chalog/package.json)
Yarn: v1.22.19 (default)
Tool binaries available: NONE
ツール一覧から削除できていればOK
corepackのインストール
以下でcorepackがインストールできる
$ volta install corepack
success: installed corepack@0.28.2 with executables: corepack, pnpm, pnpx, yarn, yarnpkg
$ corepack -v
0.28.2
corepackの有効化
$ corepack enable
$ corepack enable pnpm
pnpmの導入
$ corepack use pnpm
これでインストールでき、package.json
のpackageManager
フィールドにSHAつきの最新バージョンが記載される
なお、corepack use pnpm@latest
やcorepack use pnpm@*
でも同じ結果になる
{
...
"volta": {
"node": "20.14.0"
},
"packageManager": "pnpm@9.1.4+sha512.9df9cf27c91715646c7d675d1c9c8e41f6fce88246f1318c1aa6a1ed1aeb3c4f032fcdf4ba63cc69c4fe6d634279176b5358727d8f2cc1e65b65f43ce2f8bfb0",
...
}
pnpmの実行
ここでpnpm -v
を叩けばpnpmのバージョンが……出ない!
以下のようなエラーになる
$ pnpm -v
Volta error: No pnpm version found in this project.
ただ、pnpmは入っている
なぜ?
$ which pnpm
/home/windchime-yk/.volta/bin/pnpm
corepack導入後のpnpm実行について
これはcorepackのドキュメントにも書かれているが、corepack pnpm ~
と実行する必要がある
上記のbinは恐らく消し忘れで、pnpmは完全にcorepack配下になったものと思われる
$ corepack pnpm -v
7.25.0
corepackのドキュメントにはaliasが回避策として書かれており、alias pnpm="corepack pnpm"
と.bashrc
に書けば適用されるが、そのためにはすべてのプロジェクトをcorepack移行しないといけなくなるので、段階的にいきたい
結論から言うと無理そうだった
以下のように見つからないと出るので、大人しくalias
を書いたほうが良さそう
$ pnpm -v
コマンド 'pnpm' が見つかりません。もしかして:
command 'npm' from deb npm (8.5.1~ds-1)
次を試してみてください: sudo apt install <deb name>
ちなみに、上記はvolta install pnpm
をしても出た
corepack pnpm ~
をpackageManager
フィールドがないところで使うと自動でフィールドを差し込んでくれるので、対応していないリポジトリは逐次対応という形が良いかも
後でVoltaを入れ直して、最初からcorepackを入れたらどうなるか試す
Volta入れ直し
まず、公式ドキュメントに従って~/.volta
を削除
$ rm -rf ~/.volta
$ volta -v
-bash: /home/windchime-yk/.volta/bin/volta: そのようなファイルやディレクトリはありません
次に、また公式ドキュメントに従ってVoltaを入れ直す
$ curl https://get.volta.sh | bash
この時点でのVoltaの情報は以下になる
$ volta -v
1.1.1
$ volta list
⚡️ No Node runtimes installed!
You can install a runtime by running `volta install node`. See `volta help install` for
details and more options.
Node.jsとcorepackの再導入
まずはNode.jsを入れる
$ volta install node
success: installed and set node@20.14.0 (with npm@10.7.0) as default
$ volta list
⚡️ Currently active tools:
Node: v20.14.0 (default)
Tool binaries available: NONE
See options for more detailed reports by running `volta list --help`.
この段階ではNode.js以外のツールチェインはないので、corepackを入れる
$ volta install corepack
success: installed corepack@0.28.2 with executables: corepack, pnpm, pnpx, yarn, yarnpkg
$ volta list
⚡️ Currently active tools:
Node: v20.14.0 (default)
Tool binaries available:
corepack, pnpm, pnpx, yarn, yarnpkg (default)
See options for more detailed reports by running `volta list --help`.
pnpmの動作確認
pnpmコマンドが実行できるか確認する
$ pnpm -v
Volta error: pnpm is not available.
Use `volta install pnpm` to select a default version (see `volta help install` for more info).
$ corepack pnpm -v
7.25.0
以前同様、pnpm単体での実行は不可能
しかし、whichで確認するとすべてにbinが割り当てられている(なので以前のは消し忘れではない)
$ which pnpm
/home/windchime-yk/.volta/bin/pnpm
$ which pnpx
/home/windchime-yk/.volta/bin/pnpx
ではVolta側のpnpmとpnpxはどこを見ているかも確認すると、corepackを見ていた
$ volta which pnpm
/home/windchime-yk/.volta/tools/image/packages/corepack/bin/pnpm
$ volta which pnpx
/home/windchime-yk/.volta/tools/image/packages/corepack/bin/pnpx
このことから、pnpm側のbinはエラーを返すだけのものになっているか、内部でcorepackのbinがあるのか参照していると思われる
なので、corepack
コマンドなしだとエラーになっていた
corepack
コマンドなしでpnpm ~
は実行できないのか
結論から言えばできるcorepack enable --install-directory ~/.volta/bin
を実行すれば、~/.volta/bin
の中身がcorepackのものに上書きされる
そのため、pnpm ~
でもコマンドが動作する
corepack enable
について
CI上のCI上ではVoltaがないため、単純なcorepack enable
を実行すればpnpm ~
コマンドが動作すると思われる
あとでCI上の適用を書いたらクローズする
ローカルマシン適用編おまけ
ここで出たpnpmのbinを消し忘れだと思って実際に消したら、WSL環境だったのでWindowsのほうのVoltaを読みに行ってしまって、面倒だったのでWindowsのほうを消す羽目になった
消し忘れは結局勘違いだったので、少し時間を無駄にした