Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Composerの依存解決 #phpstudy
Search
hideki kinjyo
PRO
April 23, 2025
Programming
0
120
Composerの依存解決 #phpstudy
第175回 PHP勉強会@東京での発表資料です
https://phpstudy.connpass.com/event/350509/
hideki kinjyo
PRO
April 23, 2025
Tweet
Share
More Decks by hideki kinjyo
See All by hideki kinjyo
Composerが「依存解決」のためにどんな工夫をしているか #phpcon
o0h
PRO
1
410
「影響が少ない」を自分の目でみてみる
o0h
PRO
3
1.7k
PHPによる"非"構造化プログラミング入門 -本当に熱いスパゲティコードを求めて- #phperkaigi
o0h
PRO
0
1.6k
もう少しテストを書きたいんじゃ〜 #phpstudy
o0h
PRO
23
5.2k
『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya
o0h
PRO
10
3.8k
色んなオートローダーを覗き見る #phpcon_okinawa
o0h
PRO
5
690
ヒューマンエラーの本を読んだ ~報告会~
o0h
PRO
3
360
みんなでワイワイ「テスト駆動開発」の話をやる会 #techramen24conf
o0h
PRO
4
690
SPLから始める「データ構造」入門
o0h
PRO
7
2.3k
Other Decks in Programming
See All in Programming
AHC051解法紹介
eijirou
0
640
オープンセミナー2025@広島「君はどこで動かすか?」アンケート結果
satoshi256kbyte
0
220
STUNMESH-go: Wireguard NAT穿隧工具的源起與介紹
tjjh89017
0
390
パスタの技術
yusukebe
1
550
Improving my own Ruby thereafter
sisshiki1969
1
140
サイトを作ったらNFCタグキーホルダーを爆速で作れ!
yuukis
0
730
Google I/O recap web編 大分Web祭り2025
kponda
0
2.9k
【第4回】関東Kaggler会「Kaggleは執筆に役立つ」
mipypf
0
970
マイコンでもRustのtestがしたい その2/KernelVM Tokyo 18
tnishinaga
2
2.4k
Claude Codeで挑むOSSコントリビュート
eycjur
0
190
Ruby Parser progress report 2025
yui_knk
1
250
MCPとデザインシステムに立脚したデザインと実装の融合
yukukotani
0
350
Featured
See All Featured
Writing Fast Ruby
sferik
628
62k
Code Review Best Practice
trishagee
70
19k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.5k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
284
13k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
11
1.1k
Site-Speed That Sticks
csswizardry
10
800
Side Projects
sachag
455
43k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.4k
Transcript
Composerの依存解決 第175回 PHP勉強会@東京 Hideki Kinjyo GitHub: o0h / X: @o0h_
[発表用]
自己紹介 • 金城秀樹 / きんじょうひでき • GitHub: @o0h / 𝕏
: @o0h_ • 好きなFWはCakePHP • アイコンは美味しい鮭親子丼の写真です • 最近はPodcastをやっています • ハッシュタグ: #readlinefm
今日のお話 Comoposerの話をします
昨年、こんな話をしました
昨年、こんな話をしました その際には 深く扱わなかった部分を 浅く話します
テーマ Composerの依存解決って、どうやってるの? • 色々なパッケージが、色々なパッケージを欲しがって • さらに、対応しているバージョンにも取り決めがあって • どのパッケージに何が必要なの?は調べるまでわからないし •
調べるって言ってもネットワーク越しにしか情報がないし
テーマ Composerの依存解決って、どうやってるの? • 色々なパッケージが、色々なパッケージを欲しがって • さらに、対応しているバージョンにも取り決めがあって • どのパッケージに何が必要なの?は調べるまでわからないし •
調べるって言ってもネットワーク越しにしか情報がないし なんか大変そうじゃんね??
モチベーション 私にとって • 昨年の #phpcon では扱わなかった範囲 • 自分の理解が追いついていなかったから・・・! • 最近またコードを読んだので、リベンジ☆
モチベーション 聴く人にとって • 「へぇ〜」 • ぜひ、ハッシュタグ付きで 「#へぇ〜」とポストしてくださいね!
おしながき 1. 「ここの中身を説明するよ」の共有 2. パッケージのリストを取得しよう 3. バージョンを解釈しよう 4. 整合性を取ろう
1. 「ここの中身を説明するよ」の共有 2. パッケージのリストを取得しよう 3. バージョンを解釈しよう 4. 整合性を取ろう
パッケージをインストールしよう • PHPUnitを入れてみましょう
あるじゃろ • アレがあります
あるよね • やります
あるってば • できあがり(*^^*)
つまり? 私 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
ここの中身を説明したい • 1つ(とは限らないけども)のパッケージを要求しただけで、 • それを動かすための様々なパッケージwith詳細なバージョンが • 入ってくることを • 楽しむ心をもって、聞いて下さい
1. 「ここの中身を説明するよ」の共有 2. パッケージのリストを取得しよう 3. バージョンを解釈しよう 4. 整合性を取ろう
Composerの仕事の進め方 • Composerは、まず「必要なものを揃える」ことを完了させる • その後に、パッケージの本体(コード)を取得する
「phpunit/phpnitください」で最初にやること • 「レポジトリ」のメタ情報をとる • 「パッケージ」のメタ情報を取る => 「PHPUnitのメタ情報」を取るところから始める
「phpunit/phpnitください」で最初にやること • 「レポジトリ」のメタ情報をとる • 「パッケージ」のメタ情報を取る => 「PHPUnitのメタ情報」を取るところから始める 管理されてる パッケージ情報の
使い方とか
「phpunit/phpnitください」で最初にやること • 「レポジトリ」のメタ情報をとる • 「パッケージ」のメタ情報を取る => 「PHPUnitのメタ情報」を取るところから始める 個別パッケージの 定義情報とか
「phpunit/phpnitください」で最初にやること • 「レポジトリ」のメタ情報をとる • 「パッケージ」のメタ情報を取る • 今日はこちらの話です! => 「PHPUnitのメタ情報」を取るところから始める
PHPUnitのメタ情報 • https://repo.packagist.org/p2/phpunit/phpunit.json • 「提供できるバージョン」や、その定義が書かれている • 依存パッケージ • 取得元 •
etc. etc. etc….
PHPUnitのメタ情報 • memo: 実際に見てみましょう
余談: Composer v1 support is coming to an end •
「古いComposer使えなくなるよ」の意味の1つは、 このエンドポイントが使えなくなること • どうぞ! 『Composer 2.0って何?どう変わるの?読んでみました!』 https://speakerdeck.com/o0h/lets-read-composer2
「phpunit/phpnitください」で最初にやること • パッケージのメタ情報を取ってきて • 必要(可能性)なバージョンごとにパースして • それぞれの依存情報を読み込む
「phpunit/phpnitください」の先へ • 読み込んだ依存情報から、更にその依存情報を読み込む(!) • おもしろポイント: この時点では、まだシッカリとした「絞り込み」をしない。 可能性を広げるフェーズ
実際のログ
実際のログ phase1: phpunit
実際のログ phase2: phpunitの子依存
実際のログ phase3: 更に孫依存
一旦パッケージ全員集合させる • 「絞り込まない」状態の情報を全部突っ込む • すなわち、同一パッケージ・複数バージョンが並んでいる状態
「Pool」オブジェクトによる管理 • phpunit/phpunit:^11.2 • "available"なリストが大集合
「Pool」オブジェクトによる管理 • 依存先も同様に列挙
1. 「ここの中身を説明するよ」の共有 2. パッケージのリストを取得しよう 3. バージョンを解釈しよう 4. 整合性を取ろう
集めるだけ集めた! ここからは情報を減らすフェーズです
さっき集めたこいつら
すなわちコレら
パッケージ情報の集まりとは・・ 「ルール」の集合とみなすことができる
ルール? • 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 (*) など
Composer vs Rules 集めたパッケージ情報の 「全体のルール」を集める
ごにょごにょしてdumpしたやつ(一部)
ルールをどう表現するか? こんな風に分解して列挙 • A requires B みたいな依存 • Aのv1.1.2が入ったら、v1.2.0は入らない =>
1つ1つを「満たす」「満たせない」というboolに変換する
完全に理解しましょう(説明しません) 連言標準形 - Wikipedia https://ja.wikipedia.org/wiki/連言標準形
1. 「ここの中身を説明するよ」の共有 2. パッケージのリストを取得しよう 3. バージョンを解釈しよう 4. 整合性を取ろう
Q. 膨大なルールをどう捌いているか? • 例えば、phpunit/phpunitをインストールするだけでも • 素の状態だと1400+個のルールが入ってくる
Q. 膨大なルールをどう捌いているか? • 例えば、phpunit/phpunitをインストールするだけでも • 素の状態だと1400+個のルールが入ってくる
Q. 膨大なルールをどう捌いているか? • 例えば、phpunit/phpunitをインストールするだけでも • 素の状態だと1400+個のルールが入ってくる • これをどう捌くか?
A. かっこいい方法 • 「SAT Solver」というアプローチを取っている • https://naderman.de/slippy/src/?file=2012-06-07-Composers-SAT- Solver.html#1 • ちらっと見てみましょう
powered by いまアツい知識獲得方法
powered by いまアツい知識獲得方法
解決された様子 • 必要なパッケージごとに 「どのソースを取ってくるか」が 解決される • 例) 「不要になったバージョン」 を視覚化するとこんな感じに
解決された様子 • ふぁいなるあんさー!
まとめ
まとめ すごい良い感じにやっててすごい
おしまい! お付き合いいただき ありがとうございました!!