yarn v1 workspace+ lernaによるモノレポバージョン管理からpnpm + changesetsに乗り換えていこうという話
なぜyarn(v1)ワークスペースを辞めたのか
経緯はこちらのスクラップを参考までに。
要点だけ連ねると、
- プロジェクトへの依存を解決するために使うと、それぞれの個別のデプロイ時に他プロジェクトの依存までインストールに巻き込んでしまう。yarn focusがうまく使えない?(これは私の使い方が悪かったのかもしれません)
- lockファイルを分散できない
ちなみにyarnの新バージョンへの移行が難しかったという経緯もあります。どういうところが難しかったかというと、__dirname
に依存しているライブラリなどを巻き込んでいると難しくなります。その他の難点はこちらの記事で詳しく書かれていたのでご参照ください。
pnpm + changesetsの利点
pnpm
- インストールが速い
- npmと同じように使える
- 個別デプロイのためにpnpm-lock.yamlを生成することが可能
- filterオプションでインストールするパッケージをグループで選択できる
また、yarnなどと同様に以下のような利点があります
- バージョニング指定でも開発時に自動でローカルの最新のディレクトリを見てくれる(mainやmodule指定のファイルなどでwatchでbuildするなどの工夫は必要なことに注意)
- packageの巻き上げを抑止できる
これは開発時に必須だと思うのでありがたいです。
pnpm自体は使うのが非常に簡単です。npm i -g pnpm
でインストールができます。
changesets
- バージョニングとCHANGE LOGを好きなタイミングで更新できて管理がしやすい
- モノレポに適応するのが簡単(pnpm-workspace.yamlを配置するだけ)
- github actionsのnpm publishまでのサポートが手厚い
ちなみに一部pnpmに適応できないAPIがありますがlernaのversionコマンドなどパッケージマネージャーなどに依存性がないコマンドは使えます。
他pnpmのドキュメントにはRushやbitが代替できますが、学習コストや機能の薄さからchangesetsを採用しました。(詳しく調べきれていませんが、bitはバージョニングだけではなく、パッケージマネージャー+デプロイパイプラインまでサポートするrushを元にした統合的なツールのようです。)
rush,bitは、package.jsonを後から生成するという機構で、独自の設定ファイルフォーマットを持つため、package.jsonに書かれているscriptsのプロジェクトごとの移行などが大変なので、今回は採用しませんでした。また、bitはdev serverをbuiltinで持っていてmdxを元にしたコンポーネントのドキュメント機能などを含んでいてbitにバインドされても問題ないプロジェクトでは便利そうではあったのですが、ツールとして詰め込め過ぎているので使う場合はケースバイケースで利用するとよさそうです。
pnpmのデメリット
一方で全くデメリットがないわけではありません。
- ホスティング先のbuild pipelineでpnpmのインストールを組み込めない(ねじ込むのが大変な)ケースがある(AppEngine Standard Editionなど)
- 上記のケースを解消するためにnpm-lock.jsonなどが欲しいが、pnpm-lock.yamlからこれを生成することはできない(参考)
なので、projectとともに使用する場合は、ホスティングする環境によっては、使用ライブラリのバージョンを固定するためにpackage.json自体のバージョンをprefixを使わず直接指定するなどの対応が最も簡単になる場合があるので注意してください。
CIなどでライブラリ自体をbundleできる場合、ホスティング先でpnpmがインストールできる場合などはこの限りではありません。
(追記)GCP cloudでもpnpm対応がされつつあるので、このあたりのデメリットは少なくなってきました。またcorepackが使えるnodeであればenableをpreinstallに設定することでinstall前にpackage managerを指定できるので、大きな問題ではなくなりました。
pnpm + changesetsで実現したモノレポの例
実際に弊社で作っているアプリケーションを移行させる前の検証としてちょうど良いレポジトリがあったので、こちらを先に移行させてました。以下の設定をしてあります。
- pnpm + changesetsによるモノレポ管理
- exampleディレクトリとパッケージへの依存反映
- changesetsファイルとactionsによるCIの自動バージョニングおよび、自動デプロイ
@mochi-inc-japan/algolia-tools
興味がある方はご参考にしてみてください。
Discussion