nodeパッケージマネージャーの管理をcorepackに移行した&設定メモ

前置き

この記事は2023-02-18 corepack@0.16.0 時点でのメモです

🚨 corepackの進化に伴いこの記事は陳腐化する可能性が高いです。

移行した

Node.js自体はasdfで管理しているのだけど、npmはnodeに付いてくるやつを使いyarnとpnpmはhomebrewで粗雑にインストールしていた。

corepackがそういえばあったなと思って、一応Node.js14以降にはexperimentalとして標準搭載されているしそろそろ使うかと思って移行した。

corepackについては以下が詳しい。

zenn.dev

ようは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.jsonpackageManager のフィールドが

"packageManager": "pnpm@7.27.1+sha1.75c15a7a16389531192dab282e45aacdac1ed4c0"

こんな感じに書かれているリポジトリ

pnpm -v とかやると

gyazo.com

パソコンの中にpnpmがどこにも入ってなくても、ちゃんと 7.27.1 のバージョンのpnpmが現れて動いてくれる。

実際は corepack pnpm -v したことになって、corepackくんは packageManager のフィールドを参照してキャッシュを見に行って該当するものがあったらそれを。なかったらシュッと必要なバージョンを用意してくれている。

自分の環境だと ~/.cache/node/corepack が現場なのでここにウニョっと生える。

gyazo.com

ちなみに cleancache:corepack については、現状corepackを通じて管理されるpnpmの実体バイナリをお掃除するコマンドがないので雑に用意している。

クリーンキャッシュのコマンドが欲しいというIssue自体はある(corepack cleanup cache · Issue #114 · nodejs/corepack · GitHub)。

packageManagerフィールドに書くハッシュどこ

READMEにはハッシュまで書くのを推奨している がcorepackがこれを出力することは2023-02-18現在のv0.16.0ではできない。

これに関してもIssueがある。

Feature request: instructions on how to determine the hash for the `packageManager` field in `package.json` · Issue #231 · nodejs/corepack · GitHub

Issueにcorepackのciスクリプトの参照がある。今の所ガンバリじゃないと取れなさそうではある。

2024-04-05追記: corepack usecorepack up というコマンドがいつのまにか生えていたのでこの問題は解決していた。


余談

corepackを使わない環境で『npm | pnpm | yarn コマンドが煩雑すぎる問題』を解決したい人はこういう便利ツールもある。

npm、yarn、pnpmに直接PATHが通っている環境で「このリポジトリは…… yarnか」「ここは……pnpmか…」みたいなことを避けたい人は ni コマンドでなんも考えなくてよくなるので便利。

github.com