⛓️

monorepo でも pnpm の利用を強制させる

に公開
4
GitHubで編集を提案

Discussion

yujayuja

"packageManager": "pnpm@latest"

を package.jsonに追加する、でいいのでは?
https://docs.npmjs.com/cli/v10/configuring-npm/package-json?v=true#devengines

ajfAfgajfAfg

ご指摘ありがとうございます!

ご指摘いただいた、package.json.devEngines.packageManager の設定により pnpm の利用を強制する方法は、本稿で紹介している「engines を使う方法」と同様に、workspace に含まれる全ての package.json.devEngines.packageManager を設定する必要があります。つまり、もしあるパッケージで上記の設定がされていない場合、そのパッケージのディレクトリ配下では npm install を叩いてもエラーになりません。

全部設定すればよいのではとも思いますが、本稿のモチベーションは「全ての package.json で同じ設定をするのは面倒くさいし間違えそう」といったところから始まっており、本稿の主張は Mise を活用すると一回設定するだけでよいので嬉しいというところになります。

ryoppippiryoppippi

上のコメントにもあるように、"packageManager": "pnpm@10.17.0"のようにpackageManagerを使えばいいと思います(latestは危険かな)。またpnpmは自動的にpackageManager filedを見て適切なバージョンをダウンロードして使ってくれます。
https://pnpm.io/settings#managepackagemanagerversions

さらに、pnpm自体でnodeのversionも管理できます。
https://pnpm.io/settings#usenodeversion
https://pnpm.io/package_json#devenginesruntime

また、only-allowの侵害について本文中で触れられていますが、only-allowの作者はpnpmの作者 なので、only-allowが侵害されることとpnpm自体が侵害されることは同義です。なのでそのリスクは考えても仕方がないと思います。

個人的には、pnpmをglobalでinstallさせて、nodeおよびpnpm自身のバージョンはpnpmに寄せるのが最適解かなと考えています。

ajfAfgajfAfg

ご指摘ありがとうございます!

packageManager については、https://zenn.dev/link/comments/6205d5a69616c6 でコメントいたしました。

only-allow の侵害と pnpm の侵害は同義という点について、それぞれリポジトリが異なるのでどちらか一方のみ侵害される可能性はあるかと思いますが、考えすぎなのはそうかもです。過度に恐れて利用を避けなくてもよいかもですね。

バージョンをどこに寄せるかについては、個人的には nodepnpm 以外のコマンド(e.g. terraform)をよく Mise で管理しているので、全て Mise で完結できると嬉しいなと考えています。この辺りは宗派だと思っているので、ご指摘の通り pnpm に寄せる方針もあると思います。