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

Composer 2.0って何?
どう変わるの?
読んでみました! / lets-read-composer2!

Composer 2.0って何?
どう変わるの?
読んでみました! / lets-read-composer2!

PHP Conference Japan 2020での発表資料です

https://fortee.jp/phpcon-2020/proposal/7d06050f-a592-4869-b048-1795d2cb4fe3

C90bac78c0fb61105cfd8239767f903d?s=128

hideki kinjyo
PRO

December 12, 2020
Tweet

Transcript

  1. Composer 2.0って何? どう変わるの? 読んでみました! PHP Conference Japan 2020 Hideki Kinjyo

    GitHub: o0h / Twitter: @o0h_ [ൃද൛]
  2. ࣗݾ঺հ • ⾦城秀樹 / きんじょうひでき • GitHub: @o0h / Twitter:

    @o0h_ • 好きなFWはCakePHP • アイコンは 美味しい鮭親⼦丼の写真です
  3. ところで PHP8の噂は もう聞きましたか?

  4. PHP5->7のような 劇的なパフォーマンス改善は今回は 控えめ・・?

  5. じゃあPHPはもう速くならない?

  6. ⼤丈夫、Composer2がいますよ

  7. 本⽇は Composerのお話です! Composer\Console\Application::$logo

  8. https://blog.packagist.com/composer-2-0-is-now-available/ 2020-10-24

  9. ͓͠ͳ͕͖ 1. ͬ͟ͱComposer2ͷ৽ػೳͷ͓͞Β͍ʂ • ͲΜͳʮ໰୊ղܾʯ͕ߦΘΕͨͷʁ 2. ʮมΘͬͨ෦෼ʯͷத਎Λ೷͍ͯΈΔ • ʮύοέʔδ৘ใͷऔಘʯ·ͰͷྲྀΕͷ࡮৽Λݟൺ΂ͯΈΑ͏ ˒ʮӡ༻ʯʮҠߦϊ΢ϋ΢ʯΈ͍ͨͳ࿩͸͠·ͤΜʂ

    • Ͳ͏ͧʂ https://getcomposer.org/upgrade/UPGRADE-2.0.md
  10. ͜ͷςʔϚΛબΜͩ໨త • ໰୊ͷઃܭͱղ๏ʹڵຯ͕͋Δ => ։ൃͷ୉ޣຯͰ͠ΐʁ • ͦΕ΋ීஈ࢖͍ͬͯΔπʔϧʹى͖ͨ => ਎ۙͳ࿩ͩʂ •

    Composer͸ԿΛ૝͍ɺͲ͏มΘͬͨͷ͔ɾɾʁ
  11. この発表を通じて 「お、じゃあComposerで分からない事が あったらソース⾒てみよ!」 と思えるキッカケになったら幸い!

  12. §1: Composer2の新機能

  13. Composer2になって変わった部分を おさらいしていきます https://blog.packagist.com/composer-2-0-is-now-available/ 「1/ What's new?」より 駆け⾜で

  14. Performance improvements • ϝϞϦ࢖༻ྔ΍଎౓໘ͰͷύϑΥʔϚϯεվળ • “I've seen reports of improvements

    of over 50% to both in some projects” (!!!!) • ґଘղܾͷํ๏ͷมߋɺฒྻDLͷಋೖɺϝλσʔλಡΈ ࠐΈͷվળͳͲ
  15. Architectural changes and determinism • ґଘղܾ࣌(require, update)ͷڍಈΛมߋ • vendorσΟϨΫτϦͷத਎Λมߋ͢Δͷ͸ɺωοτϫʔΫ Λ·͍ͨͩ࡞ۀΛશͯऴ͑ͨޙʹߦ͏Α͏ʹͨ͠

    • ͜ΕʹΑͬͯʮߋ৽தʹωοτ͕੾Εͯvendor͕த్൒ ୺ʹյΕͨʯͱ͍ͬͨ໰୊΋αϤφϥʂ
  16. Partial updates with temporary constraints • ಛఆύοέʔδͷόʔδϣϯΛҰ࣌తʹߋ৽Ͱ͖ΔΑ͏ʹ • composer update

    hoge/fuga:2.* ͷΑ͏ʹར༻ • ͜͏͢Δͱcomposer.jsonϑΝΠϧ΍.lockϑΝΠϧͷ content-hashΛߋ৽͠ͳ͍ • (ύονόʔδϣϯͷࢦఆͳͲ) Ұ࣌తʹৄࡉͳࢦఆͰup/downgrade͍ͨ࣌͠ͳͲʹศརʂ
  17. ࢀߟʹͳΓͦ͏ͳจݙ • Composer 2.0 is now available! https://blog.packagist.com/composer-2-0-is-now- available/ •

    Composer 2: What's new and changed • PHP.Watch https://php.watch/articles/composer-2 ※ ։ൃத(2020-04࣌఺)ͷهࣄͳͷͰ஫ҙ
  18. §2:「変わった」の中⾝を覗いてみる

  19. まずはv2の威⼒を確認

  20. v 1.10.17 v 2.0.7 v1とv2でcakephp/cakephpを同時にrequireしてみます

  21. None
  22. めっちゃ凄い

  23. 掘り下げていきます

  24. §2.1:「パッケージ情報の取得」の 変化を⾒てみる

  25. そもそもComposerって何をするもの?

  26. Composerって何?どう動くの?読んでみました! (PHP Conference 2019) https://speakerdeck.com/o0h/lets-read-composer?slide=20

  27. Composerって何?どう動くの?読んでみました! (PHP Conference 2019) https://speakerdeck.com/o0h/lets-read-composer?slide=21

  28. PackageͱRepository • Package • 「何かを含む1つのディレクトリ」、ひとかたまりのソフ トウェア(など) • Composerの実装では Composer\Package\PackageInterfaceとして表現される

  29. PackageͱRepository • Repository • パッケージ情報を問い合わせる先で、パッケージとその バージョン情報のリストを持っている • Composerの実装では Composer\Repository\RepositoryInterface として表現さ

    れる • デフォルトのリポジトリはpackagist.org
  30. ύοέʔδ৘ใͷऔಘ·ͰͷΠϝʔδ ύοέʔδ؅ཧπʔϧ ϨϙδτϦ パッケージの情報はどうすれば⼿に⼊りますか! ココに⾏けばソレがあるよ! パッケージの情報を貰いに来ました! どうぞ〜 依存の解決や パッケージのDLへ

  31. ύοέʔδ৘ใͷऔಘ·ͰͷΠϝʔδ ྫ͑͹ʮ`vendor/hoge`ͱ͍͏ύοέʔδΛΠϯετʔϧ͢Δʯ৔߹͸ (=> ίϚϯυྫ: `composer require vendor/hoge`) 1.ʮϨϙδτϦʯʹʮvendor/hogeͷ৘ใͷࡏΓॲʯΛ໰͍߹Θͤ 2.ʮvendor/hogeͷ৘ใ(ύοέʔδͷϝλ৘ใ)ʯΛऔಘ͠ 3.

    ʮvendor/hogeͷຊମʯΛऔಘ͠ɺద੾ͳσΟϨΫτϦʹ഑ஔ͢Δ
  32. v1の場合

  33. v1ͷࡍͷେ·͔ͳྲྀΕ 1. ϨϙδτϦ(Packagist)͔ΒύοέʔδͷҰཡΛऔಘ͠ • ʮPackagistʹ͋ΔύοέʔδͷશϦετʯͷऔಘ • Ϧετ͸෼ׂ͞Ε͍ͯΔͷͰɺιϨΛॱ࣍DL 2. શϦετΛಡΈࠐΈɺͦͷத͔Β໨౰ͯͷύοέʔδ৘ใͷࡏΓॲΛಡ ΈࠐΈ

    3. 2Ͱಘͨ৘ใ͔Βύοέʔδ৘ใΛDL
  34. packages.json? • ࠷ॳʹʮpackages.jsonʯͱ͍͏ϑΝΠϧΛऔಘ • ͜Εࣗମ͸ύοέʔδ৘ใΛ࣋ͨͣɺ ϨϙδτϦʹؔ͢Δϝλ৘ใΛอ࣋ • ͜ͷ಺༰Λղऍ͠ɺ ۩ମతͳύοέʔδϦετ (provider

    file)Λ औಘ͠ʹߦ͘
  35. • ͦΕͧΕͷϑΝΠϧ͕਺MBʹٴͿ • ݱ࣌఺Ͱ13෼ׂͷϦετ͕͋ΓɺͦΕΒΛ௚ྻʹDL͢Δ 分割の様⼦ メモリと時間が 喰われていく様⼦ ハッシュ値による キャッシュ管理 p/provider-$name$%hash%.json

  36. provider.json? • {ύοέʔδ໊: {hash}}[] ͕ྻڍ͞Ε͍ͯ·͢ • ͜ΕΒͱ package.jsonͷ৘ใΛ࢖ͬͯ ύοέʔδͷϝλ৘ใͷ ډ৔ॴ͕෼͔Δ࢓૊Έ

  37. • ͦΕͧΕͷϑΝΠϧ͕਺MBʹٴͿ • ݱ࣌఺Ͱ13෼ׂͷϦετ͕͋ΓɺͦΕΒΛ௚ྻʹDL͢Δ お⽬当ての パッケージの情報をDL 全ファイルを読み込み ύοέʔδͷϝλ৘ใͷऔಘ

  38. [v1]ύοέʔδ৘ใͷऔಘ·ͰͷΠϝʔδ $PNQPTFS 1BDLBHJTU packages.json /p/provider-{$name}XXX%hash.json /p/{$name}%hash.json x13? x? ௚ྻ

  39. v1ͷΩϟογϡػߏ • provider fileɺύοέʔδͷϝλϑΝΠϧ͸ϩʔΧϧʹΩϟογϡ͞ΕΔ • ࣍ճҎ߱ɺ·ͣ͸packages.jsonʹ໰͍߹ΘͤΔ • packages.jsonʹهࡌ͞Ε͍ͯΔ֤provider fileͷϋογϡ஋ͱ ϩʔΧϧʹ͋Δprovider

    fileͷϋογϡ஋Λൺֱ • ֤provider file͸ɺͦ͜ʹؚ·ΕΔύοέʔδ͕Կ͔͠Βߋ৽͞Εͨ৔ ߹ʹϋογϡ͕ߋ৽͞ΕΔ • ΋͠ϩʔΧϧʹ͋Δ΋ͷͱಉ͡ͳΒʮߋ৽ͳ͠ʯ => Ωϟογϡར༻
  40. v2の場合

  41. ύοέʔδͷϝλ৘ใͷऔಘ·ͰͷྲྀΕ • ࠷ॳʹpackages.jsonΛऔಘͯ͠ ⾨͜Ε͸ಉ͡ • ࣍ʹύοέʔδͷϝλ৘ใΛऔಘ͢Δ ⾨ʂʁʂʁ

  42. v1 -> v2ͷมߋ఺ • provider filesΛҰ੾ಡΈࠐΜͰ͍ͳ͍ • DL΋ͯ͠ͳ͍͠ • ϝϞϦ΋࢖Θͣʮϝλ৘ใͷ৔ॴʯΛ೺ѲͰ͖͍ͯΔ

    • ܶతʹޮ཰্͕͕͍ͬͯΔ • ͪͳΈʹɺ ઌͷσϞಈը಺Ͱ࠷ॳͷϝλ৘ใͷDL։࢝࣌఺Ͱͷܦաඵ਺͸ v1͸15.04sɺv2ͩͱ0.33sͰ͢ ⾒逃しちゃうね
  43. どうやってるの・・?

  44. §2.2:新しい時代のキャッシュ戦術

  45. lazy provider • v2ͷϦϦʔεʹࡍͯ͠packages.jsonͷܗ͕ࣜมߋ͞Ε͍ͯΔ • ͦͷ಺ͷ1͕ͭ `metadata-url` ͱ͍͏ϑΟʔϧυ • ͜Ε͸ʮύοέʔδ໊͕෼͔Ε͹ϝλ৘ใͷ৔ॴ͕Θ͔Δʯͱ͍͏API

    ͱͳΔ • v1ͷ `providers-url`ʹ͸ hash஋͕ඞཁͩͬͨ => ΋͸΍ෆཁʹʂ
  46. [v2]ύοέʔδ৘ใͷऔಘ·ͰͷΠϝʔδ $PNQPTFS 1BDLBHJTU packages.json /p2/{$name}.json ʮεοΩϦͨ͠ΜͩͶʯ

  47. lazy provider • ʮઌʹϦετશಡΈࠐΈ͠ͳͯ͘OKʯͰɺ஗Ԇ = lazy • ͨͩ͠ɺlazy providerͷ࢓૊Έࣗମ͸ੲ͔Β͋ͬͨ •

    https://github.com/composer/composer/commit/44e45ed (ϦϦʔεతʹ͸1.0.0αͷ΋ͷ) • ࣮ࡍʹv1ࣗମ͔Βར༻ྫ͕͋Δ • Packagistޓ׵ͷϨϙδτϦ • force-lazy-providersΦϓγϣϯ (see: composer/composer#4269)
  48. どうして差がついたのか・・・ => 通信、キャッシュの違い

  49. lazy providerʹΑΔϝλ৘ใͷऔಘͷΠϝʔδ $PNQPTFS 1BDLBHJTU phpunit/phpunit.json psr/log.json symfony/process.json phpstan/phpstan.json 302?

  50. v2ͷΩϟογϡํࣜ • v2͸metadata-urlΛ༻͍ͯ ͋ΔҙຯͰ͸౤ػతͳϦΫΤετΛࢼߦ͍ͯ͠Δ • if-modified-sinceΛ͚ͭͯɺ302͕དྷͨΒcacheར༻ • ͦͷͨΊʹDL͢Δ ύοέʔδͷϝλ৘ใ΋ܗ͕ࣜมߋ͞Ε͍ͯΔ •

    last-modifiedϑΟʔϧυͷ௥Ճ provider-cakephp~cakephp.json
  51. ௨৴ίετͱΩϟογϡͷํࣜ ʮύϥϨϧͰϦΫΤετग़དྷΔ͔ʯʹΑΔ

  52. [v]ύοέʔδ৘ใͷऔಘ·ͰͷΠϝʔδ $PNQPTFS 1BDLBHJTU phpunit/phpunit.json, psr/log.json, symfony/process.json, phpstan/phpstan.json ฒྻ packages.json ௚ྻ

  53. Ωϟογϡํࣜͷൺֱ • v1ͷ৔߹ɿ • cons: provider fileͷશಡΈࠐΈ͕ॏ͍ • pros: ࠷ྑͷέʔεͰ͸ɺpackages.jsonΛݟ͚ͨͩͰʮߋ৽ͳ͠ʯͱ֬ఆͰ͖

    Δ • v2ͷ৔߹: • cons: ύοέʔδ਺͚ͩඞͣϦΫΤετ͕ੜ͡Δ • pros: ࠷ѱͷέʔεͰ΋ɺύοέʔδ෼ͷϝλσʔλͷྔ͔͠௨৴͠ͳ͍ͰࡁΉ
  54. Composerͱฒྻ௨৴ • (ྺ࢙తʹ)Composer͸v1࣌୅ʹ͸cURLΛੵۃతʹར༻͢ Δ͜ͱΛආ͚͍ͯΔ • curl_multi ΋ར༻͠ͳ͍ • ʮ઀ଓʯ΍ʮϦΫΤετ਺ʯΛݮΒ͢͜ͱ΁ͷ Ϟνϕʔγϣϯ͕ߴ͍

  55. Composerͱฒྻ௨৴ • 2016೥ͷ࣌఺Ͱʮຊମʹext-curlલఏͷػೳΛऔΓࠐΉ ͔ʯ͸ٞ࿦͞Ε͍ͯΔ(composer/composer#3930) • λΠϛϯάతʹʮ1.0௚લ͔ͩΒʯͱ͍͏ཧ༝ͰݟૹΓ • 1.0.0 = 5

    Apr 2016 / prestissimo 0.1.1 =7 Jan 2016
  56. v2: post ext-curl & curl_mutli • v2Ͱʮmetadata-urlʯۦಈͰΩϟογϡνΣοΫͰ͖Δͷ͸ɺ curlͷར༻΍ฒྻ௨৴ͷར༻ʹ଩Λ੾͔ͬͨΒ • file_get_contents()ͷύϑΥʔϚϯε໰୊͸ɺ

    ͔ͶͯΑΓٞ࿦ʹ্͕͍ͬͯͨ • ͨͩ͠ɺ(composer.jsonΛݟͨΒ෼͔ΔΑ͏ʹ) ext-curlΛඞਢʹ͸͍ͯ͠ͳ͍ɻ͋͘·Ͱʮ͋Ε͹ૣ͘ͳΔʯ࣮૷
  57. ͭ·ΓComposerͷv2͸ɾɾʁ ʮεοΩϦͨ͠ΜͩͶʯ

  58. §2.3: その他のv2の⾒どころ

  59. ͜͜Ͱ࿩͢ʹ͸͕࣌ؒ଍Γͳͦ͏ͳͷͰɾɾɾ ໘ന͍΋ͷΛ঺հ͠·͢ʂʂ (օ͞Μ΋Composerͷཱྀ΁μΠϒ͍ͯͩ͘͠͞ʂʂ)

  60. ʮൈຊతʯͱ͍͑Δมߋ෦෼Λ௥͍͍ͨ • issue#7630: Composer v2: Pool/Solver/Repo/Installer Tasks • ͦ΋ͦ΋ͷv2ͷݪܕͱͳΔΞΠσΟΞ͕ඳ͔Ε͍ͯΔIssue •

    pull#7904: Parallel downloads • ໊લͷ௨Γʂ • ࠓճͷ࿩΋͜͜ʹؚ·ΕΔ
  61. ʮൈຊతʯͱ͍͑Δมߋ෦෼Λ௥͍͍ͨ • pull#7625: Separate RepositorySet from Package Pool, load only

    metadata of packages directly required by naderman • ʮDLͱΠϯετʔϧ(vendorσΟϨΫτϦߋ৽)ͷ෼཭ʯΛ ਐΊΔ΋ͷ • pull #8755: Add options to configure repository priorities by Seldaek • ϨϙδτϦؒͷ༏ઌ౓ΛઃఆͰ͖ΔΑ͏ʹ͢Δ΋ͷ
  62. • ϦϦʔε࣌ͷϒϩάهࣄʹ͋ΔʮWhat's next?ʯ https://blog.packagist.com/composer-2-0-is-now-available/ • ͜ΕʹΑΔͱɺʮػೳతͳϩʔυϚοϓ͸·ͩ֬ఆ͍ͤͯ͞ͳ͍ʯ • PHPͷαϙʔτόʔδϣϯʹ͍ͭͯɻ v2.0ʹ͓͍ͯ͸PHP5.3+Λείʔϓͱ͕ͨ͠ɺ஗͘ͱ΋v2.2ʹͳΔ ࠒʹ͸PHP

    7.1.3ͷαϙʔτΛ੾Γ͍ͨ ͜Ε͔Βઌͷ͜ͱʹ͍ͭͯ
  63. §3: まとめ

  64. ComposerΊͬͪΌྑ͘ͳͬͯΔ • DL଎౓΍ϝϞϦͷ࢖͍ํɺͦͷଞʹ΋৭ʑͳ෦෼Ͱؾ͕ར ͘ߋ৽΋ؚ·Ε͍ͯ·ͨ͠ʂ • جຊతʹ͸ޓ׵ੑ΋ߴ͍͸ͣͳͷͰɺະମݧͷํ͸ੋඇ͓ ࢼ͠Λɾɾʂ • ϓϥάΠϯ࡞ऀͷํʹ͸PRΛ౤͛ͯԠԉʂ

  65. ࠷ޙʹ • ࠓճ͸׳Ε਌͠ΜͩʮComposerʯΛ୊ࡐʹɺ ίʔυʹͱͲ·ΒͣIssue΍աڈͷϦϦʔε৘ใʹ໨Λ௨ͯ͠༡ΜͰΈ·ͨ͠ • OSSͷָ͍͠ͱ͜ΖͰ͢Ͷ • த਎Λ஌Δ͜ͱͰɺ ʮҰݟੌ͗ͯ͢༁෼͔Βͳ͍ΞϨʯʹ΋ڵຯΛ࣋ͯΔͷͰ͸ͳ͍Ͱ͠ΐ͏͔ •

    ͥͻɺօ͞Μ΋਎ͷճΓʹ͋ΔOSSͷίʔυΛಡΜͰ ஥ྑ͘ͳͬͯΈ͍ͯͩ͘͞ʂ
  66. ご清聴 ありがとうございました