Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

#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.

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

#phpcon2021 #track2 今日話すこと 1 2 3 新機能の概要 新機能の実行例 新機能の使い所例 5

Slide 6

Slide 6 text

#phpcon2021 #track2 今日話さないこと 1 2 新機能の詳細について 新機能を活用した成果物 6

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

#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

Slide 13

Slide 13 text

#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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

#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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

#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

Slide 41

Slide 41 text

#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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

#phpcon2021 #track2 --lockedフラグ 46

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

#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