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
33
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
2
1.1k
PHPによる"非"構造化プログラミング入門 -本当に熱いスパゲティコードを求めて- #phperkaigi
o0h
PRO
0
1.3k
もう少しテストを書きたいんじゃ〜 #phpstudy
o0h
PRO
22
4.9k
『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya
o0h
PRO
10
3.2k
色んなオートローダーを覗き見る #phpcon_okinawa
o0h
PRO
5
610
ヒューマンエラーの本を読んだ ~報告会~
o0h
PRO
3
310
みんなでワイワイ「テスト駆動開発」の話をやる会 #techramen24conf
o0h
PRO
4
610
SPLから始める「データ構造」入門
o0h
PRO
7
2.1k
PHPUnit11の新しい仲間たち
o0h
PRO
3
470
Other Decks in Programming
See All in Programming
Unlock the Potential of Swift Code Generation
rockname
0
250
AIコーディングワークフローの試行 〜AIエージェント×ワークフローでの自動化を目指して〜
rkaga
2
3.6k
Bedrock×MCPで社内ブログ執筆文化を育てたい!
har1101
6
1k
Do Dumb Things
mitsuhiko
0
430
ウォンテッドリーの「ココロオドル」モバイル開発 / Wantedly's "kokoro odoru" mobile development
kubode
1
110
アプリを起動せずにアプリを開発して品質と生産性を上げる
ishkawa
0
2.7k
AHC045_解説
shun_pi
0
530
SwiftUI API Design Lessons
niw
1
280
Optimizing JRuby 10
headius
0
300
地域ITコミュニティの活性化とAWSに移行してみた話
yuukis
0
240
趣味全開のAITuber開発
kokushin
0
200
AI Agents with JavaScript
slobodan
0
230
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
430
65k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
9
750
The Pragmatic Product Professional
lauravandoore
33
6.5k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
135
33k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
For a Future-Friendly Web
brad_frost
176
9.7k
Fontdeck: Realign not Redesign
paulrobertlloyd
83
5.5k
The World Runs on Bad Software
bkeepers
PRO
67
11k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
30k
Become a Pro
speakerdeck
PRO
27
5.3k
Agile that works and the tools we love
rasmusluckow
328
21k
Music & Morning Musume
bryan
47
6.5k
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 いまアツい知識獲得方法
解決された様子 • 必要なパッケージごとに 「どのソースを取ってくるか」が 解決される • 例) 「不要になったバージョン」 を視覚化するとこんな感じに
解決された様子 • ふぁいなるあんさー!
まとめ
まとめ すごい良い感じにやっててすごい
おしまい! お付き合いいただき ありがとうございました!!