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

Composer 2.0 新機能概論 / New feature introduction of Composer 2.0

02
October 03, 2021

Composer 2.0 新機能概論 / New feature introduction of Composer 2.0

2021/10/03 PHPカンファレンス 2021のトークで使用したスライドです

02

October 03, 2021
Tweet

More Decks by 02

Other Decks in Programming

Transcript

  1. #phpcon2021
    #track2
    2021/10/03 PHP Conference Japan 2021
    @02
    Composer 2.0 新機能概論

    View Slide

  2. #phpcon2021
    #track2
    BASEからの刺客2人目です
    2

    View Slide

  3. #phpcon2021
    #track2
    自己紹介
    PHPカンファレンス
    2019 PHPerのためのテストコード入門
    2020 テストピラミッドを意識した
    テストコード実装戦略
    執筆
    WEB+DB PRESS Vol.121
    Composer 2によるパッケージ管理
    初のメジャーバージョンアップで大進化!
    WEB+DB PRESS Vol.118
    PuPHPeteerでE2Eテスト
    PHP版Puppeteerでお手軽正常系チェック
    BankEnd Software Enginner
    02 大津 和槻
    :@cocoeyes02
    2021/02~ BASE, Inc.

    View Slide

  4. #phpcon2021
    #track2
    今回のセッション
    2020年10月頃にリリースされた
    Composer2.0について
    時間が許す限り、広く浅く解説していきます
    4

    View Slide

  5. #phpcon2021
    #track2
    今日話すこと



    新機能の概要
    新機能の実行例
    新機能の使い所例
    5

    View Slide

  6. #phpcon2021
    #track2
    今日話さないこと


    新機能の詳細について
    新機能を活用した成果物
    6

    View Slide

  7. #phpcon2021
    #track2
    実行環境について
    今回の新機能は全てDocker環境上で実行しております。
    ● Docker 20.10.8
    ● Composer 2.0.14
    ● PHP 8.0.6
    7

    View Slide

  8. #phpcon2021
    #track2
    Composer2.0 新機能一覧
    ● パフォーマンス向上
    ● ランタイムの新機能
    ● パッケージのバージョンの部分的な更新
    ● 依存関係のエラーレポートの改善
    ● リポジトリの優先順位
    ● 新しく追加されたオプション
    8

    View Slide

  9. #phpcon2021
    #track2
    パフォーマンス向上

    View Slide

  10. #phpcon2021
    #track2
    パフォーマンス向上
    パッケージのインストールなどの速度とメモリ使用量が大幅に改善されました。
    パフォーマンス向上のためにさまざまな変更が行われましたが、
    「パッケージのメタデータのみをロードするようになったため、require/removeや部分的
    なパッケージの更新が高速化した」と補足されています。
    10

    View Slide

  11. #phpcon2021
    #track2
    パフォーマンス向上
    11

    View Slide

  12. #phpcon2021
    #track2
    パフォーマンス向上
    例:Docker環境上でLaravel/framework v8.62をrequireした場合
       Composer2.0           Composer1.10
       Memory usage: 31.9MiB      Memory usage: 552.97MiB
       peak: 42.28MiB time: 31.37s peak: 605.56MiB time: 1144.02s
    12

    View Slide

  13. #phpcon2021
    #track2
    パフォーマンス向上
    例:Docker環境上でLaravel/framework v8.62をremoveした場合
       Composer2.0           Composer1.10
       Memory usage: 9.89MiB      Memory usage: 338.8MiB
       peak: 11.62MiB time: 10.15s peak: 389.87MiB time: 770.02s
    13

    View Slide

  14. #phpcon2021
    #track2
    ランタイムの新機能

    View Slide

  15. #phpcon2021
    #track2
    プラットフォームのチェック
    PHPと拡張機能のバージョンがパッケージのプラットフォームの要件と
    一致することを確認します。
    composer check-platform-reqsコマンドを実行すると実施できます。
    15

    View Slide

  16. #phpcon2021
    #track2
    プラットフォームのチェック
    16

    View Slide

  17. #phpcon2021
    #track2
    プラットフォームのチェック
    17
    現在インストールされている拡張機能のバージョン
    現在インストールされているPHPのバージョン

    View Slide

  18. #phpcon2021
    #track2
    プラットフォームのチェック
    vendor/composer/platform_check.phpの中身を見ると
    チェックのルールの詳細がわかります。以下が例です。
    18

    View Slide

  19. #phpcon2021
    #track2
    プラットフォームのチェック
    vendor/composer/platform_check.phpの中身を見ると
    チェックのルールの詳細がわかります。以下が例です。
    19
    PHP8.0.0 以上のバージョンでなければエラー扱いとする
    拡張機能のバージョンについては今回はチェックがなさそう?

    View Slide

  20. #phpcon2021
    #track2
    プラットフォームのチェック
    使い所例
    ● 今利用している環境でcomposerが使えるのか確認したいとき
    ● CI/CDを使った環境テスト
    20

    View Slide

  21. #phpcon2021
    #track2
    パッケージ/バージョンチェック
    新しいクラスComposer\InstalledVersionsを使うと、
    どのパッケージ/バージョンが存在するかなどをコード上で確認できます。
    例:laravel/framework v8.0をinstallしている場合
    InstalledVersions::satisfies(new VersionParser, 'laravel/framework', '8.0')
    -> true
    InstalledVersions::satisfies(new VersionParser, 'laravel/framework', '^8.0')
    -> true
    InstalledVersions::satisfies(new VersionParser, 'laravel/framework', '8.1')
    -> false
    21

    View Slide

  22. #phpcon2021
    #track2
    パッケージ/バージョンチェック
    使い所例
    ● バージョンによって記法やメソッド名が変わるとき?
    ○ バージョンアップに備えてとか
    正直良い使い所が思いついていないので、
    知見がある方はぜひハッシュタグをつけてツイートして頂けると助かります!
    22

    View Slide

  23. #phpcon2021
    #track2
    パッケージの
    バージョンの部分的な更新

    View Slide

  24. #phpcon2021
    #track2
    パッケージのバージョンの
    部分的な更新
    パッケージをupdateする際、コマンド上で指定できるようになりました。
    composer.jsonでいちいちバージョンの指定をしなくても、
    特定のパッケージをアップグレード/ダウングレードできます。
    24

    View Slide

  25. #phpcon2021
    #track2
    パッケージのバージョンの
    部分的な更新
    --withフラグを付け、パッケージ名のあとにバージョンを指定します。
    例:laravel/framework 8.51 -> 8.62へ一時的にアップグレードをする
    25

    View Slide

  26. #phpcon2021
    #track2
    パッケージのバージョンの
    部分的な更新
    --withフラグを付け、パッケージ名のあとにバージョンを指定します。
    例:laravel/framework 8.51 -> 8.62へ一時的にアップグレードをする
    26

    View Slide

  27. #phpcon2021
    #track2
    パッケージのバージョンの
    部分的な更新
    --withフラグを付け、パッケージ名のあとにバージョンを指定します。
    例:laravel/framework 8.62 -> 8.51へ一時的にダウングレードをする
    27

    View Slide

  28. #phpcon2021
    #track2
    パッケージのバージョンの
    部分的な更新
    --withフラグを付け、パッケージ名のあとにバージョンを指定します。
    例:laravel/framework 8.62 -> 8.51へ一時的にダウングレードをする
    28

    View Slide

  29. #phpcon2021
    #track2
    パッケージのバージョンの
    部分的な更新
    ただし、composer.jsonのバージョンの制約に反したアップグレード/ダウングレードはで
    きないので注意が必要です。
    たとえば、"laravel/framework": "^7.0"と指定した制約がある状態で、
    一時的にlaravel 8へバージョンアップすることはできません。
    29

    View Slide

  30. #phpcon2021
    #track2
    パッケージのバージョンの
    部分的な更新
    使い所
    ● パッケージのバージョンをあげる前に動作確認をしたい!だけどいちいちcomposer.json
    をいじるのは面倒
    30

    View Slide

  31. #phpcon2021
    #track2
    依存関係の
    エラーレポートの改善

    View Slide

  32. #phpcon2021
    #track2
    依存関係のエラーレポートの改善
    依存関係が解決できない場合に表示するエラーレポートが改善されました。
    さまざまな例があるためすべてを紹介することはできませんが、
    以下のjsonでcomposer1系と2系でどうなるか紹介します。
    32

    View Slide

  33. #phpcon2021
    #track2
    依存関係のエラーレポートの改善
    Composer 1.10
    33

    View Slide

  34. #phpcon2021
    #track2
    依存関係のエラーレポートの改善
    Composer 2.0
    34

    View Slide

  35. #phpcon2021
    #track2
    リポジトリの優先順位

    View Slide

  36. #phpcon2021
    #track2
    正規/非正規リポジトリ
    Composer 2.0では依存関係を解決する際、
    リポジトリの優先順位を参考にしてパッケージを検索します。
    一番高い検索優先順位として設定されるリポジトリが、正規リポジトリ
    一番低い検索優先順位として設定されるリポジトリが、非正規リポジトリ
    36

    View Slide

  37. #phpcon2021
    #track2
    正規/非正規リポジトリ
    明示的に非正規リポジトリで設定する場合は、Composer.jsonで以下のように指定します
    {
    "repositories": [
    {
    "type": "git",
    "url": "https://github.com/Seldaek/monolog.git",
    "canonical": false
    }
    ]
    }
    37

    View Slide

  38. #phpcon2021
    #track2
    正規/非正規リポジトリ
    指定がないリポジトリはデフォルトで・・・
    Composer 2.0では正規リポジトリとして扱う
    Composer 1.xでは非正規リポジトリとして扱う
    Packagist.orgにあるリポジトリは非正規リポジトリを除いて、
    暗黙的に一番最後に検索されます。
    つまりデフォルトでは以下の検索順位の順番になります
    正規リポジトリ → Packagist.orgにあるリポジトリ → 非正規リポジトリ
    38

    View Slide

  39. #phpcon2021
    #track2
    正規/非正規リポジトリ
    正規リポジトリを用いる理由
    1つ目の理由はパフォーマンス面についてです。
    たとえば同じ名前のパッケージが複数リポジトリに存在した場合、
    正規リポジトリを優先することで全リポジトリ(非正規リポジトリを含む)のパッケージを
    読み込まなくても済むようにします。
    39

    View Slide

  40. #phpcon2021
    #track2
    正規/非正規リポジトリ
    正規リポジトリを用いる理由
    2つ目の理由はセキュリティ面についてです。
    例:foo/bar: ^2.0という非正規リポジトリのパッケージとバージョンで、
    最新バージョンが2.4.3
    このとき誰かがfoo/bar 2.999をPackagist.orgに公開すると、
    ComposerはPackagist.orgにあるfoo/bar 2.999パッケージを選択してしまい、
    意図しないインストールが起きてしまいます。
    正規リポジトリであればPackagist.orgよりも優先順位が高くなるため、
    foo/bar 2.999は選択されず、意図しないインストールを防げます。
      40

    View Slide

  41. #phpcon2021
    #track2
    パッケージのフィルタリング
    リポジトリごとに、インストールするパッケージに対する制約を加えることができます。
    {
    "repositories": [
    {
    "type": "git",
    "url": "https://github.com/Seldaek/monolog.git",
    "exclude": ["phpunit/phpunit"]
    },
    {
    "type": "git",
    "url": "https://github.com/Seldaek/monolog.git",
    "only": ["phpunit/phpunit"]
    }
    ]
    }
    41

    View Slide

  42. #phpcon2021
    #track2
    リポジトリの優先順位の使い所例
    ● 意図しないリポジトリからのインストールは防ぎたい
    ● packagist.orgからインストールする場合でも、できるだけフィルタリングしたい
    ● 正規リポジトリで設定してパッケージダウンロードの高速化を測りたい
    42

    View Slide

  43. #phpcon2021
    #track2
    新しく追加された
    オプション

    View Slide

  44. #phpcon2021
    #track2
    --dry-runフラグ
    --dry-runフラグは、require、remove、install、updateコマンド時に使用可能です。
    installとupdateはComposer 1.10でもありましたが、
    今回requireとremoveにこのオプションが追加されます。
    --dry-runフラグを付けてコマンドを実行すると、予期される実行結果を見ることができま

    44

    View Slide

  45. #phpcon2021
    #track2
    --lockedフラグ
    --lockedフラグは、show、outdatedコマンド時に使用可能です。
    --lockedフラグを付けてコマンドを実行すると、
    composer.lockに記述されているパッケージの一覧を見ることができます。
    45

    View Slide

  46. #phpcon2021
    #track2
    --lockedフラグ
    46

    View Slide

  47. #phpcon2021
    #track2
    --lockedフラグ
    47
    composer.lockを見なくても
    ロックされている
    バージョンがわかる

    View Slide

  48. #phpcon2021
    #track2
    最後に
    今回主にお話ししたのはComposer2.0の新機能についてです。
    2021/06/03には、Composer2.1がリリースされています。
    また、現在Composer1.xはEOLになっている他、Composer2.3ではPHP7.2.5より古いPHP
    バージョンはサポートしない旨がアナウンスされています。
    今回の発表がきっかけで
    「Composer2.0の機能を活用してみよう!」
    「Composer1.xからアップグレードしよう!」
    「やばいPHPのバージョン上げなきゃ・・・」
    という風になって頂けたら幸いです!
    48

    View Slide

  49. #phpcon2021
    #track2
    参考文献
    WEB+DB PRESS Vol.121
    Composer 2によるパッケージ管理 初のメジャーバージョンアップで大進化!
    https://gihyo.jp/magazine/wdpress/archive/2021/vol121
    Composer 2.0 is now available!
    https://blog.packagist.com/composer-2-0-is-now-available/
    Github Composer Complete 2.0 Changelog
    https://github.com/composer/composer/releases/tag/2.0.0
    Composer Book(Documentation)
    https://getcomposer.org/doc/
    49

    View Slide