#phperkaigi 作って遊ぼう!Composer Plugin

#phperkaigi 作って遊ぼう!Composer Plugin

PHPerKaigi2022での資料です。
https://fortee.jp/phperkaigi-2022/proposal/cc3f627d-4268-455e-9faf-fe7194a0c343

こちらは「発表版」になります。
加筆修正したり、動画を使っている箇所を静止画でも伝わるように対応した「配布版」を別にUpload予定です。

More Decks by hideki kinjyo

Other Decks in Programming

Transcript

  1. PHPer͸ComposerʹٹΘΕ·ͨ͠ ͋Γ͕ͱ͏໊લۭؒɺ͋Γ͕ͱ͏Φʔτϩʔυ • 2006೥ / PHP5.1.2: spl_autoload_registerͷࢥ͍ग़ • 2009೥ /

    PHP5.3.0: ॳΊͯͷ໊લۭؒͷࢥ͍ग़ • 2009೥: PHP Standards GroupͱPSR-0ͷࢥ͍ग़ • 2010೥: SplClassLoader(RFC)ͷࢥ͍ग़
  2. ࣗݾ঺հ • ⾦城秀樹 / きんじょうひでき • GitHub: @o0h / Twitter:

    @o0h_ • 好きなFWはCakePHP • アイコンは 美味しい鮭親⼦丼の写真です 
  3. ͓͠ͳ͕͖ 1.ຊ౰ʹ͋ͬͨʂComposer Plugin ʙ࣮ྫἫʙ 2. ֓આ: Composer Plugin 3. ͘͢͝؆୯ͳPluginͷ࣮૷ྫ

    4. ৭ʑͳPluginͷத਎ΛงғؾͰಡΜͰΈΔ 時間に余裕があれば!
  4. composer require symfony/thanks { ֦ுϙΠϯτ: ಠࣗͷίϚϯυΛ௥Ճ͢Δ } • `composer thanks`ͱ͍͏ίϚϯυΛ௥Ճ

    • ͋ͳͨͷϓϩδΣΫτͰ͓ੈ࿩ʹͳ͍ͬͯΔύοέʔδʹ GitHubͷελʔΛૹͬͯ͘ΕΔʂ
  5. composer require phpstan/extension-installer { 拡張ポイント: パッケージの追加時の挙動を追加する } • PHPStanのextensionがrequire/update時に、 ⾃動的にプラグインを有効化

    • PHPStanが読み込みに⾏くように設定ファイルに追記 • 設定ファイルを⼿動でいじる必要がなくなる!
  6. composer require bamarni/composer-bin-plugin { ֦ுϙΠϯτ: Πϯετʔϧͷઓུ(ϑΝΠϧͷ഑ஔઌ)Λมߋ͢Δ } • ։ൃܥͷπʔϧ(౳)Λɺ௨ৗͷvendorͱ͸ผͷ৔ॴʹ഑ஔ͢Δ •

    ؒ઀తʹґଘ͢Δύοέʔδ౳ͷίϯϑϦΫτΛղফ͢Δ • ʮϓϩμΫτίʔυͱlinterπʔϧͰཁٻ͢Δόʔδϣϯ͕ҧ ͏ʂʯͱ͍ͬͨ࣌ʹ΋ɺʮͦΕͧΕ͕ඞཁͳґଘόʔδϣϯΛ ֬อ͢Δʯ͜ͱ͕Ͱ͖Δ
  7. ݁ہͳΜͳͷͰ͔͢ʁ doc: https://getcomposer.org/doc/articles/plugins.md • “You may wish to alter or

    expand Composer's functionality with your own.” • “In these cases you could consider creating a plugin to handle your specific logic.” 意訳: 君だけのComposerロジックを⼿に⼊れろ!
  8. ಠࣗίϚϯυͷొ࿥ { Capability } Plugin͔ΒɺComposerʹରͯ͠ ʮར༻ՄೳͳίϚϯυҰཡͷऔಘํ ๏ʯΛڞ༗͢Δɻ `Capable::getCapabilities(): array<class-string, class-string>`

    ͷ࣮૷ ྫ: bamarni/composer-bin-plugin ࢀߟ 4FUUJOHVQBOEVTJOHQMVHJOT$PNQPTFS IUUQTHFUDPNQPTFSPSHEPDBSUJDMFTQMVHJOTNEQMVHJO DBQBCJMJUJFT
  9. Plugin Composer プラグイン本体 <Interface> Capable プラグインを 読み込むよ! お、Capability持ってるな 独⾃のコマンドを 提供できます!

    詳しくは プロバイダを参照! <Interface> CommandProvider プロバイダ どんなコマンド ある? コマンドの ⼀覧です! <Interface> PluginInterface コマンド Command DO COMMAND! I DO!
  10. Plugin Composer プラグイン本体 <Interface> EventSubscriberInterface プラグインを 読み込むよ! お、Subscriberだな <Interface> PluginInterface

    何を購読してる? 購読の⼀覧です! 処理 イベント発⽕ それ購読してる! I DO SOMETHING!
  11. コマンドの 前処理に⼊るよ! その前に◦◦が使えるか チェックして! イベント プラグイン パッケージの meta情報をDLしたよ! ライセンスを 確認して!

    パッケージの インストールを 完了したよ! tests以下は削除して! レポジトリ情報を 取得するよ! VPN有効? サーバー接続確認して! ྫ: Πϕϯτ㲗ϓϥάΠϯͰ৭ʑͳֻ͚߹͍͕Ͱ͖Δͷਤ .lockファイルを 書き込んだよ! minifyして!
  12. ͲΜͳΠϕϯτ͕͋ΔͷͰ͔͢ʁ • େ·͔ʹ4ܥ౷ͷΠϕϯτ͕͋Δ • Plugin Events / Command Events /

    Package Events / Installer Events • Πϕϯτ͸ͦΕͧΕʹԠͨ͡ίϯςΩετ৘ใΛؚ༗ͯ͠ ͓ΓɺϦεφ͸ͦΕΒͷ৘ใͱCompoerΦϒδΣΫτɾIO ΦϒδΣΫτΛ૊Έ߹Θͤͯ೚ҙͷॲཧΛ࣮૷͢Δ ࢀߟ &WFOUOBNFT IUUQTHFUDPNQPTFSPSHEPDBSUJDMFTTDSJQUTNEFWFOUOBNFT
  13. 1. Plugin Events ComposerͷجװΛ୲͏ॲཧͱͰ΋ݴ͏΂͖λΠϛϯάʹൃՐ͞ΕΔ Πϕϯτ໊ͷఆٛϑΝΠϧ: \ Composer\Plugin\PluginEvents { ओͳΠϕϯτ }

    ComposerΦϒδΣΫτͷॳظԽɺCommandͷॳظԽɺϑΝΠϧͷDLલޙͳͲ { ओͳίϯςΩετ } ʮϑΝΠϧͷμ΢ϯϩʔυલʯͰ͋Ε͹ʮऔಘઌͷURL৘ใʯɺʮCommandͷ࣮ߦલ (ॳظԽத)ʯͰ͋Ε͹ʮೖྗ৘ใʯͱ͍ͬͨίϯςΩετΛѻ͑Δ ※ ϓϥάΠϯ಺෦΍ؔ࿈ॲཧʹ͍ͭͯͷΠϕϯτͱ͍͏ࣄͰ͸ͳ͘ɺ ʮϓϥάΠϯͱ͍͏ར༻ऀͷͨΊʹ༻ҙ͞ΕͨΠϕϯτͱ͍͏ػߏͷ͏ͪɺҰൠతͳ΋ͷʯΈ͍ͨͳχϡΞϯεͳͷͩͱࢥ͍·͢
  14. 3. Package Events ύοέʔδݸผͷల։΍഑ஔɺআڈͷલޙʹൃՐ͞ΕΔ Πϕϯτ໊ͷఆٛϑΝΠϧ: \Composer\Installer\PackageEvents { ओͳΠϕϯτ } ֤ύοέʔδʹର͢Δʮinstallʯʮupdateʯʮremoveʯͷ࣮ߦલɺ࣮ߦޙ

    { ओͳίϯςΩετ } ର৅ύοέʔδ৘ใ(໊લɾόʔδϣϯetc)ɺૢ࡞಺༰(৽͘͠ஔ͘ͷ͔ɺߋ ৽͢Δͷ͔ɺআڈ͢Δͷ͔)ͱ͍ͬͨίϯςΩετΛѻ͑Δ ※ల։ = ΞʔΧΠϒͷղౚɺ഑ஔ = vendorσΟϨΫτϦԼ΁ͷҠಈ
  15. 4. Installer Events ύοέʔδશମͷ഑ஔ࣮ߦલʹൃՐ͞ΕΔ Πϕϯτ໊ͷఆٛϑΝΠϧ: \Composer\Installer\InstallerEvents { ओͳΠϕϯτ } ಛఆ͞Εͨύοέʔδͷऔಘ΍഑ஔͷલ

    { ओͳίϯςΩετ } ഑ஔΛߦ͏͔dry-run͔ɺҰ࿈ͷ഑ஔॲཧΛྻڍͨ͠಺༰(τϥϯ βΫγϣϯ)ͱ͍ͬͨίϯςΩετΛѻ͑Δ