Closed18

【逐次移行が良さそう】Volta管理のpnpmを削除してcorepack管理に移行したい

ピン留めされたアイテム
WhyKWhyK

まとめ

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"
}
WhyKWhyK

なぜ移行したいのか

  • corepackを有効化することで、pnpm/action-setupを使わずにactions/setup-nodeのみに依存を絞れるため
  • corepackはNode.jsパッケージマネージャーの新しい管理方法であり、取り入れたほうが今後の利益になるため
  • Voltaの最新更新が現時点で2023年の1月と1年以上更新がなく、今後別のパッケージマネージャー管理ツールに移行する可能性もあるため

volta uninstall pnpmはなぜ動作しないのか

Voltaにはuninstallサブコマンドが存在するが、pnpmuninstallしようとすると以下のような表示が出て実行されない

error: Uninstalling pnpm is not supported yet.

これは、現時点でVoltaのuninstallのほとんどがSpecとして実装されており、すべてパッケージのuninstall以外では未実装としてエラーが返ってくるため
https://github.com/volta-cli/volta/blob/v1.1.1/crates/volta-core/src/tool/mod.rs#L120-L146
一部の記事ではvolta uninstall pnpmとして紹介されているが、Volta自体がpnpmを管理している場合は手動で削除する必要がある

参考資料

https://zenn.dev/longrun_jp/articles/volta-node-corepack-pnpm
https://github.com/volta-cli/volta/issues/327
https://github.com/volta-cli/volta/issues/327#issuecomment-920336408
https://zenn.dev/longrun_jp/articles/hello-corepack-goodbye-pnpm-action-setup

WhyKWhyK

実行環境は以下

$ uname -sr
Linux 5.15.146.1-microsoft-standard-WSL2

$ node -v
v20.14.0
WhyKWhyK

手動で~/.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`.

順番がグチャグチャなので、整理しつつ確認する

WhyKWhyK

削除対象のディレクトリ

  • ~/.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

WhyKWhyK

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
WhyKWhyK

pnpmの導入

$ corepack use pnpm

これでインストールでき、package.jsonpackageManagerフィールドにSHAつきの最新バージョンが記載される
なお、corepack use pnpm@latestcorepack 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
WhyKWhyK

corepack導入後のpnpm実行について

これはcorepackのドキュメントにも書かれているが、corepack pnpm ~と実行する必要がある
上記のbinは恐らく消し忘れで、pnpmは完全にcorepack配下になったものと思われる
https://github.com/nodejs/corepack?tab=readme-ov-file#corepack-enable--name

$ corepack pnpm -v
7.25.0

corepackのドキュメントにはaliasが回避策として書かれており、alias pnpm="corepack pnpm".bashrcに書けば適用されるが、そのためにはすべてのプロジェクトをcorepack移行しないといけなくなるので、段階的にいきたい

WhyKWhyK

結論から言うと無理そうだった
以下のように見つからないと出るので、大人しくaliasを書いたほうが良さそう

$ pnpm -v
コマンド 'pnpm' が見つかりません。もしかして:
  command 'npm' from deb npm (8.5.1~ds-1)
次を試してみてください: sudo apt install <deb name>

ちなみに、上記はvolta install pnpmをしても出た

WhyKWhyK

corepack pnpm ~packageManagerフィールドがないところで使うと自動でフィールドを差し込んでくれるので、対応していないリポジトリは逐次対応という形が良いかも

WhyKWhyK

後でVoltaを入れ直して、最初からcorepackを入れたらどうなるか試す

WhyKWhyK

Volta入れ直し

まず、公式ドキュメントに従って~/.voltaを削除
https://docs.volta.sh/advanced/uninstall

$ rm -rf ~/.volta
$ volta -v
-bash: /home/windchime-yk/.volta/bin/volta: そのようなファイルやディレクトリはありません

次に、また公式ドキュメントに従ってVoltaを入れ直す
https://docs.volta.sh/guide/getting-started

$ 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.
WhyKWhyK

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`.
WhyKWhyK

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コマンドなしだとエラーになっていた

WhyKWhyK

corepackコマンドなしでpnpm ~は実行できないのか

結論から言えばできる
https://github.com/volta-cli/volta/issues/987#issuecomment-914502143
上記のIssueコメントにあるcorepack enable --install-directory ~/.volta/binを実行すれば、~/.volta/binの中身がcorepackのものに上書きされる
そのため、pnpm ~でもコマンドが動作する

CI上のcorepack enableについて

CI上ではVoltaがないため、単純なcorepack enableを実行すればpnpm ~コマンドが動作すると思われる

WhyKWhyK

あとでCI上の適用を書いたらクローズする

WhyKWhyK

ローカルマシン適用編おまけ

ここで出たpnpmのbinを消し忘れだと思って実際に消したら、WSL環境だったのでWindowsのほうのVoltaを読みに行ってしまって、面倒だったのでWindowsのほうを消す羽目になった
https://zenn.dev/link/comments/074d79c7494746
消し忘れは結局勘違いだったので、少し時間を無駄にした

このスクラップは2ヶ月前にクローズされました