packwerk
https://github.com/Shopify/packwerk
モジュール間の依存関係を静的解析するライブラリ
Shopify製
コード群をpackagesに分割し、packages間の依存関係やアクセスを制御できる
ディレクトリにコードを移動するだけなので修正がしやすい
いきなりマイクロサービスに切り出すのではなくファイル移動でモジュール化を試せる
2024-01
A Packwerk Retrospective
Shopifyによる振り返り
意味論的なコード分割は依存関係の整理を必ずしも意味しない
利用例
本家 https://shopify.engineering/enforcing-modularity-rails-apps-packwerk
note https://note.com/konpyu/n/nc27f32c49213
https://speakerdeck.com/shshimamo/monorisitukurailsapurikesiyonwo-moziyuramonorisuheyi-xing-siteiru-notenoshi-li
Gusto
2022-05 https://medium.com/gusto-engineering/laying-the-cultural-and-technical-foundation-for-big-rails-6b5ab78349ed
2023-01 https://medium.com/gusto-engineering/a-how-to-guide-to-ruby-packs-gustos-gem-ecosystem-for-modularizing-ruby-applications-e236126b8c2c
Gradual Modularization for Ruby and Railsを執筆したのもGustoのエンジニア
gemやRails engineによるアプローチとの違いは「段階的なモジュール化(not 厳格な境界)」「低コストで作成・変更できる」
2024-06 The current state of Gusto’s modularity tooling
packwerkを使い400のpackagesができたが認知負荷は高いままだった
論理的には20のpackagesで十分だった
packagesを削減する試みが進行中(nesting pack etc.)
ツールはpackwerkとほぼ互換のRust製のpksに移行した
Timee
https://tech.timee.co.jp/entry/2024/12/18/000932
タイミーでは packwerk, packwerk-extensions で提供されているチェッカーのうち、Dependency Checker と Privacy Checker を利用しています
Dependency Checker : テストの枝刈り
パッケージの循環依存をなくす必要がある
Shopifyは依存関係を一方向にするためにpub/subのような機構を使っている
Sorbet の利用が実質的には必須
本来なら渡されるべきでなくクラスのインスタンスが引数で渡ってくるなど、静的解析では違反を検出できないことがあるため、ランタイムにおけるSorbetの動的解析も必要
完全に個人的な意見にはなりますが、Shopify の状況を見るに依存グラフを作成することによるテストの実行時間の削減は現実的ではないと考えています。
Privacy Checker
パッケージの利用方法を絞りたいときに使う