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
78
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
「影響が少ない」を自分の目でみてみる
o0h
PRO
3
1.4k
PHPによる"非"構造化プログラミング入門 -本当に熱いスパゲティコードを求めて- #phperkaigi
o0h
PRO
0
1.3k
もう少しテストを書きたいんじゃ〜 #phpstudy
o0h
PRO
22
5k
『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya
o0h
PRO
10
3.3k
色んなオートローダーを覗き見る #phpcon_okinawa
o0h
PRO
5
620
ヒューマンエラーの本を読んだ ~報告会~
o0h
PRO
3
320
みんなでワイワイ「テスト駆動開発」の話をやる会 #techramen24conf
o0h
PRO
4
620
SPLから始める「データ構造」入門
o0h
PRO
7
2.1k
PHPUnit11の新しい仲間たち
o0h
PRO
3
490
Other Decks in Programming
See All in Programming
Global Azure 2025 @ Kansai / Hyperlight
kosmosebi
0
140
Ruby on Railroad: The Power of Visualizing CFG
ydah
0
310
eBPF超入門「o11yに使える」とは (20250424_eBPF_o11y)
thousanda
1
110
プロフェッショナルとしての成長「問題の深掘り」が導く真のスキルアップ / issue-analysis-and-skill-up
minodriven
8
1.9k
カウシェで Four Keys の改善を試みた理由
ike002jp
1
130
Improve my own Ruby
sisshiki1969
1
110
The New Developer Workflow: How AI Transforms Ideas into Code
danielsogl
0
120
Orleans + Sekiban + SignalR でリアルタイムWeb作ってみた
tomohisa
0
240
flutter_kaigi_mini_4.pdf
nobu74658
0
150
大LLM時代にこの先生きのこるには-ITエンジニア編
fumiyakume
8
3.3k
UMAPをざっくりと理解 / Overview of UMAP
kaityo256
PRO
3
1.5k
ぽちぽち選択するだけでOSSを読めるVSCode拡張機能
ymbigo
14
6.1k
Featured
See All Featured
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.8k
The Cost Of JavaScript in 2023
addyosmani
49
7.8k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
The Language of Interfaces
destraynor
158
25k
Fontdeck: Realign not Redesign
paulrobertlloyd
84
5.5k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
137
33k
A Modern Web Designer's Workflow
chriscoyier
693
190k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
179
53k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.3k
Designing for humans not robots
tammielis
253
25k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.6k
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 いまアツい知識獲得方法
解決された様子 • 必要なパッケージごとに 「どのソースを取ってくるか」が 解決される • 例) 「不要になったバージョン」 を視覚化するとこんな感じに
解決された様子 • ふぁいなるあんさー!
まとめ
まとめ すごい良い感じにやっててすごい
おしまい! お付き合いいただき ありがとうございました!!