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

hideki kinjyo
PRO

December 12, 2020
Tweet

More Decks by hideki kinjyo

Other Decks in Programming

Transcript

  1. Composer 2.0って何?
    どう変わるの?
    読んでみました!
    PHP Conference Japan 2020
    Hideki Kinjyo
    GitHub: o0h / Twitter: @o0h_
    [ൃද൛]

    View Slide

  2. ࣗݾ঺հ
    • ⾦城秀樹 / きんじょうひでき
    • GitHub: @o0h / Twitter: @o0h_
    • 好きなFWはCakePHP
    • アイコンは
    美味しい鮭親⼦丼の写真です

    View Slide

  3. ところで
    PHP8の噂は
    もう聞きましたか?

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  10. ͜ͷςʔϚΛબΜͩ໨త
    • ໰୊ͷઃܭͱղ๏ʹڵຯ͕͋Δ => ։ൃͷ୉ޣຯͰ͠ΐʁ
    • ͦΕ΋ීஈ࢖͍ͬͯΔπʔϧʹى͖ͨ => ਎ۙͳ࿩ͩʂ
    • Composer͸ԿΛ૝͍ɺͲ͏มΘͬͨͷ͔ɾɾʁ

    View Slide

  11. この発表を通じて
    「お、じゃあComposerで分からない事が
    あったらソース⾒てみよ!」
    と思えるキッカケになったら幸い!

    View Slide

  12. §1: Composer2の新機能

    View Slide

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

    View Slide

  14. Performance improvements
    • ϝϞϦ࢖༻ྔ΍଎౓໘ͰͷύϑΥʔϚϯεվળ
    • “I've seen reports of improvements of over 50% to both
    in some projects” (!!!!)
    • ґଘղܾͷํ๏ͷมߋɺฒྻDLͷಋೖɺϝλσʔλಡΈ
    ࠐΈͷվળͳͲ

    View Slide

  15. Architectural changes and determinism
    • ґଘղܾ࣌(require, update)ͷڍಈΛมߋ
    • vendorσΟϨΫτϦͷத਎Λมߋ͢Δͷ͸ɺωοτϫʔΫ
    Λ·͍ͨͩ࡞ۀΛશͯऴ͑ͨޙʹߦ͏Α͏ʹͨ͠
    • ͜ΕʹΑͬͯʮߋ৽தʹωοτ͕੾Εͯvendor͕த్൒
    ୺ʹյΕͨʯͱ͍ͬͨ໰୊΋αϤφϥʂ

    View Slide

  16. Partial updates with temporary constraints
    • ಛఆύοέʔδͷόʔδϣϯΛҰ࣌తʹߋ৽Ͱ͖ΔΑ͏ʹ
    • composer update hoge/fuga:2.* ͷΑ͏ʹར༻
    • ͜͏͢Δͱcomposer.jsonϑΝΠϧ΍.lockϑΝΠϧͷ
    content-hashΛߋ৽͠ͳ͍
    • (ύονόʔδϣϯͷࢦఆͳͲ)
    Ұ࣌తʹৄࡉͳࢦఆͰup/downgrade͍ͨ࣌͠ͳͲʹศརʂ

    View Slide

  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࣌఺)ͷهࣄͳͷͰ஫ҙ

    View Slide

  18. §2:「変わった」の中⾝を覗いてみる

    View Slide

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

    View Slide

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

    View Slide

  21. View Slide

  22. めっちゃ凄い

    View Slide

  23. 掘り下げていきます

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  32. v1の場合

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  39. v1ͷΩϟογϡػߏ
    • provider fileɺύοέʔδͷϝλϑΝΠϧ͸ϩʔΧϧʹΩϟογϡ͞ΕΔ
    • ࣍ճҎ߱ɺ·ͣ͸packages.jsonʹ໰͍߹ΘͤΔ
    • packages.jsonʹهࡌ͞Ε͍ͯΔ֤provider fileͷϋογϡ஋ͱ
    ϩʔΧϧʹ͋Δprovider fileͷϋογϡ஋Λൺֱ
    • ֤provider file͸ɺͦ͜ʹؚ·ΕΔύοέʔδ͕Կ͔͠Βߋ৽͞Εͨ৔
    ߹ʹϋογϡ͕ߋ৽͞ΕΔ
    • ΋͠ϩʔΧϧʹ͋Δ΋ͷͱಉ͡ͳΒʮߋ৽ͳ͠ʯ => Ωϟογϡར༻

    View Slide

  40. v2の場合

    View Slide

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

    View Slide

  42. v1 -> v2ͷมߋ఺
    • provider filesΛҰ੾ಡΈࠐΜͰ͍ͳ͍
    • DL΋ͯ͠ͳ͍͠
    • ϝϞϦ΋࢖Θͣʮϝλ৘ใͷ৔ॴʯΛ೺ѲͰ͖͍ͯΔ
    • ܶతʹޮ཰্͕͕͍ͬͯΔ
    • ͪͳΈʹɺ
    ઌͷσϞಈը಺Ͱ࠷ॳͷϝλ৘ใͷDL։࢝࣌఺Ͱͷܦաඵ਺͸
    v1͸15.04sɺv2ͩͱ0.33sͰ͢
    ⾒逃しちゃうね

    View Slide

  43. どうやってるの・・?

    View Slide

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

    View Slide

  45. lazy provider
    • v2ͷϦϦʔεʹࡍͯ͠packages.jsonͷܗ͕ࣜมߋ͞Ε͍ͯΔ
    • ͦͷ಺ͷ1͕ͭ `metadata-url` ͱ͍͏ϑΟʔϧυ
    • ͜Ε͸ʮύοέʔδ໊͕෼͔Ε͹ϝλ৘ใͷ৔ॴ͕Θ͔Δʯͱ͍͏API
    ͱͳΔ
    • v1ͷ `providers-url`ʹ͸
    hash஋͕ඞཁͩͬͨ
    => ΋͸΍ෆཁʹʂ

    View Slide

  46. [v2]ύοέʔδ৘ใͷऔಘ·ͰͷΠϝʔδ
    $PNQPTFS 1BDLBHJTU
    packages.json
    /p2/{$name}.json
    ʮεοΩϦͨ͠ΜͩͶʯ

    View Slide

  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)

    View Slide

  48. どうして差がついたのか・・・
    => 通信、キャッシュの違い

    View Slide

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

    View Slide

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

    View Slide

  51. ௨৴ίετͱΩϟογϡͷํࣜ
    ʮύϥϨϧͰϦΫΤετग़དྷΔ͔ʯʹΑΔ

    View Slide

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

    View Slide

  53. Ωϟογϡํࣜͷൺֱ
    • v1ͷ৔߹ɿ
    • cons: provider fileͷશಡΈࠐΈ͕ॏ͍
    • pros: ࠷ྑͷέʔεͰ͸ɺpackages.jsonΛݟ͚ͨͩͰʮߋ৽ͳ͠ʯͱ֬ఆͰ͖
    Δ
    • v2ͷ৔߹:
    • cons: ύοέʔδ਺͚ͩඞͣϦΫΤετ͕ੜ͡Δ
    • pros: ࠷ѱͷέʔεͰ΋ɺύοέʔδ෼ͷϝλσʔλͷྔ͔͠௨৴͠ͳ͍ͰࡁΉ

    View Slide

  54. Composerͱฒྻ௨৴
    • (ྺ࢙తʹ)Composer͸v1࣌୅ʹ͸cURLΛੵۃతʹར༻͢
    Δ͜ͱΛආ͚͍ͯΔ
    • curl_multi ΋ར༻͠ͳ͍
    • ʮ઀ଓʯ΍ʮϦΫΤετ਺ʯΛݮΒ͢͜ͱ΁ͷ
    Ϟνϕʔγϣϯ͕ߴ͍

    View Slide

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

    View Slide

  56. v2: post ext-curl & curl_mutli
    • v2Ͱʮmetadata-urlʯۦಈͰΩϟογϡνΣοΫͰ͖Δͷ͸ɺ
    curlͷར༻΍ฒྻ௨৴ͷར༻ʹ଩Λ੾͔ͬͨΒ
    • file_get_contents()ͷύϑΥʔϚϯε໰୊͸ɺ
    ͔ͶͯΑΓٞ࿦ʹ্͕͍ͬͯͨ
    • ͨͩ͠ɺ(composer.jsonΛݟͨΒ෼͔ΔΑ͏ʹ)
    ext-curlΛඞਢʹ͸͍ͯ͠ͳ͍ɻ͋͘·Ͱʮ͋Ε͹ૣ͘ͳΔʯ࣮૷

    View Slide

  57. ͭ·ΓComposerͷv2͸ɾɾʁ
    ʮεοΩϦͨ͠ΜͩͶʯ

    View Slide

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

    View Slide

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

    View Slide

  60. ʮൈຊతʯͱ͍͑Δมߋ෦෼Λ௥͍͍ͨ
    • issue#7630: Composer v2: Pool/Solver/Repo/Installer Tasks
    • ͦ΋ͦ΋ͷv2ͷݪܕͱͳΔΞΠσΟΞ͕ඳ͔Ε͍ͯΔIssue
    • pull#7904: Parallel downloads
    • ໊લͷ௨Γʂ
    • ࠓճͷ࿩΋͜͜ʹؚ·ΕΔ

    View Slide

  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
    • ϨϙδτϦؒͷ༏ઌ౓ΛઃఆͰ͖ΔΑ͏ʹ͢Δ΋ͷ

    View Slide

  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ͷαϙʔτΛ੾Γ͍ͨ
    ͜Ε͔Βઌͷ͜ͱʹ͍ͭͯ

    View Slide

  63. §3: まとめ

    View Slide

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

    View Slide

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

    View Slide

  66. ご清聴
    ありがとうございました

    View Slide