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
160
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
#phperbiglt のLT
o0h
PRO
0
56
手軽に積ん読を増やすには?/読みたい本と付き合うには?
o0h
PRO
1
200
symfony/mcp-bundleで、既存アプリケーションもお手軽にMCPサーバー化
o0h
PRO
1
81
組織もソフトウェアも難しく考えない、もっとシンプルな考え方で設計する #phpconfuk
o0h
PRO
10
5.3k
Composerが「依存解決」のためにどんな工夫をしているか #phpcon
o0h
PRO
1
650
「影響が少ない」を自分の目でみてみる
o0h
PRO
4
2.2k
PHPによる"非"構造化プログラミング入門 -本当に熱いスパゲティコードを求めて- #phperkaigi
o0h
PRO
0
1.8k
もう少しテストを書きたいんじゃ〜 #phpstudy
o0h
PRO
23
5.4k
『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya
o0h
PRO
9
4.3k
Other Decks in Programming
See All in Programming
[KNOTS 2026登壇資料]AIで拡張‧交差する プロダクト開発のプロセス および携わるメンバーの役割
hisatake
0
190
Vibe Coding - AI 驅動的軟體開發
mickyp100
0
160
ELYZA_Findy AI Engineering Summit登壇資料_AIコーディング時代に「ちゃんと」やること_toB LLMプロダクト開発舞台裏_20251216
elyza
2
1.3k
組織で育むオブザーバビリティ
ryota_hnk
0
150
今から始めるClaude Code超入門
448jp
2
1.5k
0→1 フロントエンド開発 Tips🚀 #レバテックMeetup
bengo4com
0
530
gunshi
kazupon
1
140
なぜSQLはAIぽく見えるのか/why does SQL look AI like
florets1
0
400
ZJIT: The Ruby 4 JIT Compiler / Ruby Release 30th Anniversary Party
k0kubun
1
390
余白を設計しフロントエンド開発を 加速させる
tsukuha
7
2k
Unicodeどうしてる? PHPから見たUnicode対応と他言語での対応についてのお伺い
youkidearitai
PRO
0
990
GISエンジニアから見たLINKSデータ
nokonoko1203
0
190
Featured
See All Featured
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
160
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
120
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.2k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
9.4k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
75
For a Future-Friendly Web
brad_frost
182
10k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
230
Optimizing for Happiness
mojombo
379
71k
Art, The Web, and Tiny UX
lynnandtonic
304
21k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
310
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
1
85
Designing for Timeless Needs
cassininazir
0
120
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 いまアツい知識獲得方法
解決された様子 • 必要なパッケージごとに 「どのソースを取ってくるか」が 解決される • 例) 「不要になったバージョン」 を視覚化するとこんな感じに
解決された様子 • ふぁいなるあんさー!
まとめ
まとめ すごい良い感じにやっててすごい
おしまい! お付き合いいただき ありがとうございました!!