【非推奨】2024年こそ corepack を使おう
普段の開発では nodenv を使って各プロジェクトのバージョンに合わせた Node.js をインストールしています。その後、各プロジェクトの README や package.json を頼りに npm install -g yarn
や npm install -g pnpm
することが多いです。
先日、同僚から「最近は corepack 使ってますよ」と教えてもらったので、「おーもう実務で使えるのかー」と一気にモチベーションが上がったので corepack 使っていきたいと思います。
まずはこちらの鉄板記事でおさらい。
corepack を使っていくということは yarn や pnpm の管理を corepack に任せるということなので、まずは global install しているそれらを削除して実験してみます。
yarn を使っているプロジェクトで検証
とある yarn を使っているプロジェクト
$ node -v
v18.19.0
$ yarn -v
1.22.19
$ corepack -v
0.22.0
yarn を削除してみます。
$ npm uninstall -g yarn
いなくなりました。
$ yarn
nodenv: yarn: command not found
package.json
に packageManager
フィールドを追加します。
"packageManager": "yarn@1.22.19"
corepack enable yarn
はまだ必須なのかなーと調べるために、あえてこのまま yarn
実行。まだだめ。
$ yarn
nodenv: yarn: command not found
corepack enable yarn
します。
$ corepack enable yarn
そして、おもむろに yarn と叩くと...
$ yarn
yarn install v1.22.19
[1/5] 🔍 Validating package.json...
[2/5] 🔍 Resolving packages...
success Already up-to-date.
✨ Done in 0.20s.
うおおおおおおおおおおおおお!勝手にインストールされて実行されました!わかっていても感動する🎉
pnpm を使っているプロジェクトで検証
とある pnpm を使っているプロジェクト
$ node -v
v18.9.0
$ pnpm -v
8.7.0
$ corepack -v
0.17.1
corepack のバージョンがちょっと古い 0.17 なのは、node が 18.9 と、先ほどのプロジェクトの 18.19 よりも node 自体がちょっと古いからですかね。
pnpm を削除してみます。
$ npm uninstall -g pnpm
あれ、いなくならない
$ pnpm
Version 8.7.0
よくよく確認すると...おおお!こちらの既存プロジェクトでは既に "packageManager": "pnpm@8.7.0"
が package.json
に定義されていました。さすが同僚氏!
しかも過去に無意識で corepack enable pnpm
をしたことがあったことも、この記事を書きながら検証していて気付きました。なんだったら Dockerfile ではかなり前から当たり前に使われていて、corepack って既に常識にすらなっていたんですね。知らなかった!
corepack use
corepack 0.20 以降は corepack use
コマンドで package.json への追加ができます。しかもこのコマンドを使うと SHA-256 ハッシュを含むバージョンが指定されます。公式の README では、セキュリティのため、ハッシュはオプションだけど付与することが強く推奨されています。
corepack use
使用例
$ corepack use yarn@1.22.19
Installing yarn@1.22.19 in the project...
yarn install v1.22.19
追加されるバージョン
{
"packageManager": "yarn@1.22.19+sha256.732620bac8b1690d507274f025f3c6cfdc3627a84d9642e38a07452cc00e0f2e"
}
まとめ
Node.js にバンドルされていてすぐに使えますし、既に当たり前に使っている人は多そうですが、yarn や pnpm の管理がシュッとできて便利なので、2024年こそ corepack 使っていきましょう!
昨日までの私のように、まだ corepack を意識して使っていなくて、そろそろ使った方が良いのかなーどうなのかなーとちょっと迷っている方の参考になれば幸いです。
それでは!
Discussion