nodeパッケージマネージャーの管理をcorepackに移行した&設定メモ
前置き
この記事は2023-02-18 corepack@0.16.0 時点でのメモです
🚨 corepackの進化に伴いこの記事は陳腐化する可能性が高いです。
移行した
Node.js自体はasdfで管理しているのだけど、npmはnodeに付いてくるやつを使いyarnとpnpmはhomebrewで粗雑にインストールしていた。
corepackがそういえばあったなと思って、一応Node.js14以降にはexperimentalとして標準搭載されているしそろそろ使うかと思って移行した。
corepackについては以下が詳しい。
ようはnpmとかyarnとかpnpmのようなnodeパッケージマネージャーのマネージャー。マネージャーinマネージャー。
corepackはnode18とかだともうexperimentalとはいえ標準でenableになっているのでnodeが動く環境なら corepack コマンドのPATHが通っている。
取り急ぎ yarn と pnpm と一旦サヨナラをする。
brew uninstall yarn pnpm
corepackで管理するとコマンドが冗長になる問題
グローバルな存在のpnpmをインストールしないようにするゆえ、これまで pnpm install とかやってたのが corepack pnpm install になる。しんどすぎる。
corepack run みたいなことできるようになりたいという npm script 絡みのIssueがあるけど色々ありそう。
Feature request: corepack run · Issue #57 · nodejs/corepack · GitHub
エイリアスでごまかす
corepackを通してパッケージマネージャーの実体を解決するから、自分でPATH通そうにもダルいし、なんとなくそのうちcorepack自体がなんとかする気がするからエイリアスでごまかすことにした。
alias pnpm='corepack pnpm' alias yarn='corepack yarn' # alias cleancache:corepack='rm -rf ~/.cache/node/corepack/'
fishシェルの
config.fishに雑に書く
そして package.json の packageManager のフィールドが
"packageManager": "pnpm@7.27.1+sha1.75c15a7a16389531192dab282e45aacdac1ed4c0"
こんな感じに書かれているリポジトリで
pnpm -v とかやると
パソコンの中にpnpmがどこにも入ってなくても、ちゃんと 7.27.1 のバージョンのpnpmが現れて動いてくれる。
実際は corepack pnpm -v したことになって、corepackくんは packageManager のフィールドを参照してキャッシュを見に行って該当するものがあったらそれを。なかったらシュッと必要なバージョンを用意してくれている。
自分の環境だと ~/.cache/node/corepack が現場なのでここにウニョっと生える。
ちなみに cleancache:corepack については、現状corepackを通じて管理されるpnpmの実体バイナリをお掃除するコマンドがないので雑に用意している。
クリーンキャッシュのコマンドが欲しいというIssue自体はある(corepack cleanup cache · Issue #114 · nodejs/corepack · GitHub)。
2024-09-02追記:いつのまにか corepack cache clean のAPIが生えていてIssueが解決していた
packageManagerフィールドに書くハッシュどこ
READMEにはハッシュまで書くのを推奨している がcorepackがこれを出力することは2023-02-18現在のv0.16.0ではできない。
これに関してもIssueがある。
Issueにcorepackのciスクリプトの参照がある。今の所ガンバリじゃないと取れなさそうではある。
2024-04-05追記: corepack use と corepack up というコマンドがいつのまにか生えていたのでこの問題は解決していた。
余談
corepackを使わない環境で『npm | pnpm | yarn コマンドが煩雑すぎる問題』を解決したい人はこういう便利ツールもある。
npm、yarn、pnpmに直接PATHが通っている環境で「このリポジトリは…… yarnか」「ここは……pnpmか…」みたいなことを避けたい人は ni コマンドでなんも考えなくてよくなるので便利。

