corepack が標準同梱じゃなくなる未来、 mise でパッケージマネージャを管理する
mise とは
言語環境の管理は *env や *vm を超えて、 mise へ という記事を書いたので詳しくはこちらをご参照ください。
簡単にいうと多言語対応の言語環境マネージャで(もっと多機能なのですが)、npm をバックエンドに node 製の cli まで管理できる、というものです。
つまり、 yarn や pnpm もグローバルでバージョン管理できるということになります。
似た機能を持つものに volta が存在しますが、筆者の主観だと mise の方が安定した挙動をしており、高速です。
mise の npm backend 機能
mise では npm をバックエンドにして npm library な cli を管理する、という機能があります。(執筆現在 Experimental です)
https://mise.jdx.dev/dev-tools/backends/
例えば、いかなる Node のバージョンであっても prettier v2 を使用したい場合、以下のように .mise.toml に定義します。
[tools]
"npm:prettier" = "2.*"
※ここで注意しなければならないのが、 package.json のような ^
や ~
は使えないということです。"^2.0.0"
を指定すると 2.0.0 がインストールされます。
これと同様の手法を corepack なき環境において、任意のパッケージマネージャでも行います。
具体的な設定値
mise が設定ファイルを読む順番は公式ドキュメントに記載がある通りですが、ここでは最も優先して読まれ、 XDG Base Directory にも則っている ~/.config/mise/config.toml
に、グローバルの設定ファイルを配置します。
[tools]
node = "latest"
"npm:pnpm" = "latest"
ここでは latest を指定していますが、グローバルで使用するパッケージマネージャのバージョンが固定されている場合はそれを指定してください。
次に、プロジェクトによってはパッケージマネージャのバージョンが厳密に管理されていたり、常に最新になるようにはメンテナンスされていないものもあるかと思います。それらについては、各プロジェクトディレクトリの .mise.toml に以下のように設定します。
[tools]
"npm:yarn" = "1.22.22"
ただし、 mise は package.json の packageManager フィールドを見てくれるということはないため、 packageManager と同一のバージョンになるよう、手動で .mise.toml を管理する必要があります。
最後に
corepack の利点であったアウトオブボックスという利点は失われてしまいますが、 corepack enable
だけでは常に package.json の packageManager
フィールドをうまく見てくれないような挙動に悩まされることもなくなります。
対抗として volta を検討している方も多いようですが、あちらもあちらで npm module をグローバルにインストールした際に挙動がおかしくなった経験がありますしそういう話もよく聞きますので、うまく動かなかった場合は mise を試してみるのもいいかもしれません。
Discussion