2021/10/03 PHPカンファレンス 2021のトークで使用したスライドです
#phpcon2021#track22021/10/03 PHP Conference Japan 2021@02Composer 2.0 新機能概論
View Slide
#phpcon2021#track2BASEからの刺客2人目です2
#phpcon2021#track2自己紹介PHPカンファレンス2019 PHPerのためのテストコード入門2020 テストピラミッドを意識したテストコード実装戦略執筆WEB+DB PRESS Vol.121Composer 2によるパッケージ管理初のメジャーバージョンアップで大進化!WEB+DB PRESS Vol.118PuPHPeteerでE2EテストPHP版Puppeteerでお手軽正常系チェックBankEnd Software Enginner02 大津 和槻:@cocoeyes022021/02~ BASE, Inc.
#phpcon2021#track2今回のセッション2020年10月頃にリリースされたComposer2.0について時間が許す限り、広く浅く解説していきます4
#phpcon2021#track2今日話すこと123新機能の概要新機能の実行例新機能の使い所例5
#phpcon2021#track2今日話さないこと12新機能の詳細について新機能を活用した成果物6
#phpcon2021#track2実行環境について今回の新機能は全てDocker環境上で実行しております。● Docker 20.10.8● Composer 2.0.14● PHP 8.0.67
#phpcon2021#track2Composer2.0 新機能一覧● パフォーマンス向上● ランタイムの新機能● パッケージのバージョンの部分的な更新● 依存関係のエラーレポートの改善● リポジトリの優先順位● 新しく追加されたオプション8
#phpcon2021#track2パフォーマンス向上
#phpcon2021#track2パフォーマンス向上パッケージのインストールなどの速度とメモリ使用量が大幅に改善されました。パフォーマンス向上のためにさまざまな変更が行われましたが、「パッケージのメタデータのみをロードするようになったため、require/removeや部分的なパッケージの更新が高速化した」と補足されています。10
#phpcon2021#track2パフォーマンス向上11
#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.02s12
#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.02s13
#phpcon2021#track2ランタイムの新機能
#phpcon2021#track2プラットフォームのチェックPHPと拡張機能のバージョンがパッケージのプラットフォームの要件と一致することを確認します。composer check-platform-reqsコマンドを実行すると実施できます。15
#phpcon2021#track2プラットフォームのチェック16
#phpcon2021#track2プラットフォームのチェック17現在インストールされている拡張機能のバージョン現在インストールされているPHPのバージョン
#phpcon2021#track2プラットフォームのチェックvendor/composer/platform_check.phpの中身を見るとチェックのルールの詳細がわかります。以下が例です。18
#phpcon2021#track2プラットフォームのチェックvendor/composer/platform_check.phpの中身を見るとチェックのルールの詳細がわかります。以下が例です。19PHP8.0.0 以上のバージョンでなければエラー扱いとする拡張機能のバージョンについては今回はチェックがなさそう?
#phpcon2021#track2プラットフォームのチェック使い所例● 今利用している環境でcomposerが使えるのか確認したいとき● CI/CDを使った環境テスト20
#phpcon2021#track2パッケージ/バージョンチェック新しいクラスComposer\InstalledVersionsを使うと、どのパッケージ/バージョンが存在するかなどをコード上で確認できます。例:laravel/framework v8.0をinstallしている場合InstalledVersions::satisfies(new VersionParser, 'laravel/framework', '8.0')-> trueInstalledVersions::satisfies(new VersionParser, 'laravel/framework', '^8.0')-> trueInstalledVersions::satisfies(new VersionParser, 'laravel/framework', '8.1')-> false21
#phpcon2021#track2パッケージ/バージョンチェック使い所例● バージョンによって記法やメソッド名が変わるとき?○ バージョンアップに備えてとか正直良い使い所が思いついていないので、知見がある方はぜひハッシュタグをつけてツイートして頂けると助かります!22
#phpcon2021#track2パッケージのバージョンの部分的な更新
#phpcon2021#track2パッケージのバージョンの部分的な更新パッケージをupdateする際、コマンド上で指定できるようになりました。composer.jsonでいちいちバージョンの指定をしなくても、特定のパッケージをアップグレード/ダウングレードできます。24
#phpcon2021#track2パッケージのバージョンの部分的な更新--withフラグを付け、パッケージ名のあとにバージョンを指定します。例:laravel/framework 8.51 -> 8.62へ一時的にアップグレードをする25
#phpcon2021#track2パッケージのバージョンの部分的な更新--withフラグを付け、パッケージ名のあとにバージョンを指定します。例:laravel/framework 8.51 -> 8.62へ一時的にアップグレードをする26
#phpcon2021#track2パッケージのバージョンの部分的な更新--withフラグを付け、パッケージ名のあとにバージョンを指定します。例:laravel/framework 8.62 -> 8.51へ一時的にダウングレードをする27
#phpcon2021#track2パッケージのバージョンの部分的な更新--withフラグを付け、パッケージ名のあとにバージョンを指定します。例:laravel/framework 8.62 -> 8.51へ一時的にダウングレードをする28
#phpcon2021#track2パッケージのバージョンの部分的な更新ただし、composer.jsonのバージョンの制約に反したアップグレード/ダウングレードはできないので注意が必要です。たとえば、"laravel/framework": "^7.0"と指定した制約がある状態で、一時的にlaravel 8へバージョンアップすることはできません。29
#phpcon2021#track2パッケージのバージョンの部分的な更新使い所● パッケージのバージョンをあげる前に動作確認をしたい!だけどいちいちcomposer.jsonをいじるのは面倒30
#phpcon2021#track2依存関係のエラーレポートの改善
#phpcon2021#track2依存関係のエラーレポートの改善依存関係が解決できない場合に表示するエラーレポートが改善されました。さまざまな例があるためすべてを紹介することはできませんが、以下のjsonでcomposer1系と2系でどうなるか紹介します。32
#phpcon2021#track2依存関係のエラーレポートの改善Composer 1.1033
#phpcon2021#track2依存関係のエラーレポートの改善Composer 2.034
#phpcon2021#track2リポジトリの優先順位
#phpcon2021#track2正規/非正規リポジトリComposer 2.0では依存関係を解決する際、リポジトリの優先順位を参考にしてパッケージを検索します。一番高い検索優先順位として設定されるリポジトリが、正規リポジトリ一番低い検索優先順位として設定されるリポジトリが、非正規リポジトリ36
#phpcon2021#track2正規/非正規リポジトリ明示的に非正規リポジトリで設定する場合は、Composer.jsonで以下のように指定します{"repositories": [{"type": "git","url": "https://github.com/Seldaek/monolog.git","canonical": false}]}37
#phpcon2021#track2正規/非正規リポジトリ指定がないリポジトリはデフォルトで・・・Composer 2.0では正規リポジトリとして扱うComposer 1.xでは非正規リポジトリとして扱うPackagist.orgにあるリポジトリは非正規リポジトリを除いて、暗黙的に一番最後に検索されます。つまりデフォルトでは以下の検索順位の順番になります正規リポジトリ → Packagist.orgにあるリポジトリ → 非正規リポジトリ38
#phpcon2021#track2正規/非正規リポジトリ正規リポジトリを用いる理由1つ目の理由はパフォーマンス面についてです。たとえば同じ名前のパッケージが複数リポジトリに存在した場合、正規リポジトリを優先することで全リポジトリ(非正規リポジトリを含む)のパッケージを読み込まなくても済むようにします。39
#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
#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
#phpcon2021#track2リポジトリの優先順位の使い所例● 意図しないリポジトリからのインストールは防ぎたい● packagist.orgからインストールする場合でも、できるだけフィルタリングしたい● 正規リポジトリで設定してパッケージダウンロードの高速化を測りたい42
#phpcon2021#track2新しく追加されたオプション
#phpcon2021#track2--dry-runフラグ--dry-runフラグは、require、remove、install、updateコマンド時に使用可能です。installとupdateはComposer 1.10でもありましたが、今回requireとremoveにこのオプションが追加されます。--dry-runフラグを付けてコマンドを実行すると、予期される実行結果を見ることができます44
#phpcon2021#track2--lockedフラグ--lockedフラグは、show、outdatedコマンド時に使用可能です。--lockedフラグを付けてコマンドを実行すると、composer.lockに記述されているパッケージの一覧を見ることができます。45
#phpcon2021#track2--lockedフラグ46
#phpcon2021#track2--lockedフラグ47composer.lockを見なくてもロックされているバージョンがわかる
#phpcon2021#track2最後に今回主にお話ししたのはComposer2.0の新機能についてです。2021/06/03には、Composer2.1がリリースされています。また、現在Composer1.xはEOLになっている他、Composer2.3ではPHP7.2.5より古いPHPバージョンはサポートしない旨がアナウンスされています。今回の発表がきっかけで「Composer2.0の機能を活用してみよう!」「Composer1.xからアップグレードしよう!」「やばいPHPのバージョン上げなきゃ・・・」という風になって頂けたら幸いです!48
#phpcon2021#track2参考文献WEB+DB PRESS Vol.121Composer 2によるパッケージ管理 初のメジャーバージョンアップで大進化!https://gihyo.jp/magazine/wdpress/archive/2021/vol121Composer 2.0 is now available!https://blog.packagist.com/composer-2-0-is-now-available/Github Composer Complete 2.0 Changeloghttps://github.com/composer/composer/releases/tag/2.0.0Composer Book(Documentation)https://getcomposer.org/doc/49