Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PhpStorm と Docker の壊し方 〜モジュラモノリスへの幻想と失敗〜

mpyw
April 11, 2022

PhpStorm と Docker の壊し方 〜モジュラモノリスへの幻想と失敗〜

2022/04/11 PHPer Kaigi 2022 の LT の発表内容です。

モジュラモノリスのコンテキスト分離戦略において,「仮想的にパッケージ分割して静的解析ツールで縛る」「本当にパッケージ分割する」の2通りがありますが,後者を選択した結果地獄を見てしまったのでその知見を共有します。

あと Docker Desktop for Mac はマジで壊れます

mpyw

April 11, 2022
Tweet

More Decks by mpyw

Other Decks in Programming

Transcript

  1. お前誰? • こいつ → • @mpyw と書いてまっぴーと読むらしい • 最近ゆめみという会社に転職したらしい •

    Laravel 愛好家 [要出典] • #Laravelファサードと裁判してる党 依存性逆転の原則違反で の党首 [要出典] • モジュラモノリスで四苦八苦中
  2. モジュラモノリスってなんだっけ? • 最近アツいやつ • PHPer Kaigi 2022 でもかなり注目されてる • Shopify

    が 2019年に提唱した • モノリスとマイクロサービスの中間的なアーキテクチャ
  3. 境界を超えたアクセスをしない状態を守らせる方法 • 特定の名前空間上で,クラスの use でのインポートや new でのインスタンス生成を禁じる ◦ https://github.com/spaze/phpstan-disallowed-calls ◦

    https://github.com/qossmic/deptrac (要するに仮想的なパッケージ分割) • 本当にパッケージ分割しちゃう ◦ composer.json を各パッケージが持つ ◦ モノレポ(1つのリポジトリ)で管理 ◦ 依存関係は最小にする ◦ インタフェース分離をし,依存性逆転の原則を適用する
  4. 構成例 src/ ├── composer.json ├── composer.lock └── packages/ ├── user/

    └── payment/ user/ ├── impl/ │ ├── src/ │ └── composer.json └── contract/ ├── src/ └── composer.json payment/ ├── impl/ │ ├── src/ │ └── composer.json └── contract/ ├── src/ └── composer.json ユーザ管理 アプリケーションルート 支払い
  5. vendor をインストールすると…? src/ ├── composer.json ├── composer.lock ├── vendor/ └──

    packages/ ├── user/ └── payment/ user/ ├── impl/ │ ├── src/ │ ├── vendor/ │ └── composer.json └── contract/ ├── src/ ├── vendor/ └── composer.json payment/ ├── impl/ │ ├── src/ │ ├── vendor/ │ └── composer.json └── contract/ ├── src/ ├── vendor/ └── composer.json
  6. vendor をインストールすると…? payment/ ├── impl/ │ ├── src/ │ ├──

    composer.json │ └── vendor/ │ └── yumemi/ │ ├── user-contract/ ↩ │ └── payment-contract/ ↩ └── contract/ シンボリックリンクで ローカルパッケージを参照!
  7. パッケージごとにセットアップすることの大変さ • docker compose exec php bash ◦ cd packages/user/impl/src;

    composer install ◦ cd packages/user/contract/src; composer install ◦ cd packages/payment/impl/src; composer install ◦ cd packages/payment/contract/src; composer install • 面倒なのでシェルスクリプトの ./d ファイルと -p <package> オプションを整備して簡略化
  8. 敗因 • Docker Desktop for Mac のファイル IO は 最弱

    • 並列書き込みに耐えられない どうする…?
  9. vendor をシンボリックリンクで共通化 src/ ├── composer.json ├── composer.lock ├── vendor/ └──

    packages/ ├── user/ └── payment/ user/ ├── impl/ │ ├── src/ │ ├── vendor/ ↩ │ └── composer.json └── contract/ ├── src/ ├── vendor/ ↩ └── composer.json payment/ ├── impl/ │ ├── src/ │ ├── vendor/ ↩ │ └── composer.json └── contract/ ├── src/ ├── vendor/ ↩ └── composer.json
  10. 更なる問題 • ルートの composer.json 以外の autoload が PhpStorm に解析されない →

    一時的にルートの composer.json に全ての autoload を   取り込んでから dump-autoload → そもそも PhpStorm で一気に開くの諦める • ルートの composer.json 以外の require-dev が インストールされない → 一時的にルートの composer.json に全ての require-dev   を取り込んでから dump-autoload
  11. まとめ • PhpStorm でモノレポ構成のモジュラモノリスやるなら 仮想的なパッケージ分割だけで何とかしろ • 実際に分割するとマジで地獄です ◦ パッケージごとの CI

    が最小構成で回ってるのを見るのは美しいけどね… ◦ 大人しく静的解析ツールの機能に頼りましょう • Docker Desktop for Mac はよく死ぬ • PhpStorm もたまに死ぬ