Slide 1

Slide 1 text

Composerの依存解決 第175回 PHP勉強会@東京 Hideki Kinjyo GitHub: o0h / X: @o0h_ [発表用]

Slide 2

Slide 2 text

自己紹介 • 金城秀樹 / きんじょうひでき • GitHub: @o0h / 𝕏 : @o0h_ • 好きなFWはCakePHP • アイコンは美味しい鮭親子丼の写真です • 最近はPodcastをやっています • ハッシュタグ: #readlinefm 

Slide 3

Slide 3 text

今日のお話 Comoposerの話をします 

Slide 4

Slide 4 text

昨年、こんな話をしました 

Slide 5

Slide 5 text

昨年、こんな話をしました その際には 深く扱わなかった部分を 浅く話します 

Slide 6

Slide 6 text

テーマ  Composerの依存解決って、どうやってるの? • 色々なパッケージが、色々なパッケージを欲しがって • さらに、対応しているバージョンにも取り決めがあって • どのパッケージに何が必要なの?は調べるまでわからないし • 調べるって言ってもネットワーク越しにしか情報がないし

Slide 7

Slide 7 text

テーマ  Composerの依存解決って、どうやってるの? • 色々なパッケージが、色々なパッケージを欲しがって • さらに、対応しているバージョンにも取り決めがあって • どのパッケージに何が必要なの?は調べるまでわからないし • 調べるって言ってもネットワーク越しにしか情報がないし なんか大変そうじゃんね??

Slide 8

Slide 8 text

モチベーション 私にとって • 昨年の #phpcon では扱わなかった範囲 • 自分の理解が追いついていなかったから・・・! • 最近またコードを読んだので、リベンジ☆ 

Slide 9

Slide 9 text

モチベーション 聴く人にとって • 「へぇ〜」 • ぜひ、ハッシュタグ付きで 「#へぇ〜」とポストしてくださいね! 

Slide 10

Slide 10 text

おしながき 1. 「ここの中身を説明するよ」の共有 2. パッケージのリストを取得しよう 3. バージョンを解釈しよう 4. 整合性を取ろう 

Slide 11

Slide 11 text

1. 「ここの中身を説明するよ」の共有 2. パッケージのリストを取得しよう 3. バージョンを解釈しよう 4. 整合性を取ろう

Slide 12

Slide 12 text

パッケージをインストールしよう • PHPUnitを入れてみましょう 

Slide 13

Slide 13 text

あるじゃろ • アレがあります 

Slide 14

Slide 14 text

あるよね • やります 

Slide 15

Slide 15 text

あるってば • できあがり(*^^*) 

Slide 16

Slide 16 text

つまり?  私 PHPUnitください PHPUnitください PHPUnitください PHPUnitください PHPUnitください PHPUnitください PHPUnitください PHPUnitください PHPUnitください PHPUnitください sebastian/ global-state sebastian/ object-enumerator sebastian/ object-reflector sebastian/ recursion-context sebastian/type sebastian/version staabm/side- effects-detector

Slide 17

Slide 17 text

ここの中身を説明したい • 1つ(とは限らないけども)のパッケージを要求しただけで、 • それを動かすための様々なパッケージwith詳細なバージョンが • 入ってくることを • 楽しむ心をもって、聞いて下さい 

Slide 18

Slide 18 text

1. 「ここの中身を説明するよ」の共有 2. パッケージのリストを取得しよう 3. バージョンを解釈しよう 4. 整合性を取ろう

Slide 19

Slide 19 text

Composerの仕事の進め方 • Composerは、まず「必要なものを揃える」ことを完了させる • その後に、パッケージの本体(コード)を取得する 

Slide 20

Slide 20 text

「phpunit/phpnitください」で最初にやること • 「レポジトリ」のメタ情報をとる • 「パッケージ」のメタ情報を取る => 「PHPUnitのメタ情報」を取るところから始める 

Slide 21

Slide 21 text

「phpunit/phpnitください」で最初にやること • 「レポジトリ」のメタ情報をとる • 「パッケージ」のメタ情報を取る => 「PHPUnitのメタ情報」を取るところから始める  管理されてる パッケージ情報の 使い方とか

Slide 22

Slide 22 text

「phpunit/phpnitください」で最初にやること • 「レポジトリ」のメタ情報をとる • 「パッケージ」のメタ情報を取る => 「PHPUnitのメタ情報」を取るところから始める  個別パッケージの 定義情報とか

Slide 23

Slide 23 text

「phpunit/phpnitください」で最初にやること • 「レポジトリ」のメタ情報をとる • 「パッケージ」のメタ情報を取る • 今日はこちらの話です! => 「PHPUnitのメタ情報」を取るところから始める 

Slide 24

Slide 24 text

PHPUnitのメタ情報 • https://repo.packagist.org/p2/phpunit/phpunit.json • 「提供できるバージョン」や、その定義が書かれている • 依存パッケージ • 取得元 • etc. etc. etc…. 

Slide 25

Slide 25 text

PHPUnitのメタ情報 • memo: 実際に見てみましょう 

Slide 26

Slide 26 text

余談: Composer v1 support is coming to an end • 「古いComposer使えなくなるよ」の意味の1つは、 このエンドポイントが使えなくなること • どうぞ! 『Composer 2.0って何?どう変わるの?読んでみました!』 https://speakerdeck.com/o0h/lets-read-composer2 

Slide 27

Slide 27 text

「phpunit/phpnitください」で最初にやること • パッケージのメタ情報を取ってきて • 必要(可能性)なバージョンごとにパースして • それぞれの依存情報を読み込む 

Slide 28

Slide 28 text

「phpunit/phpnitください」の先へ • 読み込んだ依存情報から、更にその依存情報を読み込む(!) • おもしろポイント: この時点では、まだシッカリとした「絞り込み」をしない。 可能性を広げるフェーズ 

Slide 29

Slide 29 text

実際のログ 

Slide 30

Slide 30 text

実際のログ  phase1: phpunit

Slide 31

Slide 31 text

実際のログ  phase2: phpunitの子依存

Slide 32

Slide 32 text

実際のログ  phase3: 更に孫依存

Slide 33

Slide 33 text

一旦パッケージ全員集合させる • 「絞り込まない」状態の情報を全部突っ込む • すなわち、同一パッケージ・複数バージョンが並んでいる状態 

Slide 34

Slide 34 text

「Pool」オブジェクトによる管理 • phpunit/phpunit:^11.2 • "available"なリストが大集合 

Slide 35

Slide 35 text

「Pool」オブジェクトによる管理 • 依存先も同様に列挙 

Slide 36

Slide 36 text

1. 「ここの中身を説明するよ」の共有 2. パッケージのリストを取得しよう 3. バージョンを解釈しよう 4. 整合性を取ろう

Slide 37

Slide 37 text

集めるだけ集めた! ここからは情報を減らすフェーズです

Slide 38

Slide 38 text

さっき集めたこいつら 

Slide 39

Slide 39 text

すなわちコレら 

Slide 40

Slide 40 text

パッケージ情報の集まりとは・・ 「ルール」の集合とみなすことができる 

Slide 41

Slide 41 text

ルール? • phpunit/phpunit requires php (>= 8.2.0.0-dev) • sebastian/exporter requires sebastian/recursion-context ([>= 6.0.0.0-dev < 7.0.0.0-dev]) • phpunit/phpunit requires ext-json (*) など 

Slide 42

Slide 42 text

Composer vs Rules 集めたパッケージ情報の 「全体のルール」を集める 

Slide 43

Slide 43 text

ごにょごにょしてdumpしたやつ(一部) 

Slide 44

Slide 44 text

ルールをどう表現するか? こんな風に分解して列挙 • A requires B みたいな依存 • Aのv1.1.2が入ったら、v1.2.0は入らない => 1つ1つを「満たす」「満たせない」というboolに変換する 

Slide 45

Slide 45 text

完全に理解しましょう(説明しません) 連言標準形 - Wikipedia https://ja.wikipedia.org/wiki/連言標準形 

Slide 46

Slide 46 text

1. 「ここの中身を説明するよ」の共有 2. パッケージのリストを取得しよう 3. バージョンを解釈しよう 4. 整合性を取ろう

Slide 47

Slide 47 text

Q. 膨大なルールをどう捌いているか? • 例えば、phpunit/phpunitをインストールするだけでも • 素の状態だと1400+個のルールが入ってくる 

Slide 48

Slide 48 text

Q. 膨大なルールをどう捌いているか? • 例えば、phpunit/phpunitをインストールするだけでも • 素の状態だと1400+個のルールが入ってくる 

Slide 49

Slide 49 text

Q. 膨大なルールをどう捌いているか? • 例えば、phpunit/phpunitをインストールするだけでも • 素の状態だと1400+個のルールが入ってくる • これをどう捌くか? 

Slide 50

Slide 50 text

A. かっこいい方法 • 「SAT Solver」というアプローチを取っている • https://naderman.de/slippy/src/?file=2012-06-07-Composers-SAT- Solver.html#1 • ちらっと見てみましょう 

Slide 51

Slide 51 text

powered by いまアツい知識獲得方法 

Slide 52

Slide 52 text

powered by いまアツい知識獲得方法 

Slide 53

Slide 53 text

解決された様子 • 必要なパッケージごとに 「どのソースを取ってくるか」が 解決される • 例) 「不要になったバージョン」 を視覚化するとこんな感じに 

Slide 54

Slide 54 text

解決された様子 • ふぁいなるあんさー! 

Slide 55

Slide 55 text

まとめ

Slide 56

Slide 56 text

まとめ すごい良い感じにやっててすごい 

Slide 57

Slide 57 text

おしまい! お付き合いいただき ありがとうございました!!