Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
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
130
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
1
120
symfony/mcp-bundleで、既存アプリケーションもお手軽にMCPサーバー化
o0h
PRO
1
35
組織もソフトウェアも難しく考えない、もっとシンプルな考え方で設計する #phpconfuk
o0h
PRO
10
4.6k
Composerが「依存解決」のためにどんな工夫をしているか #phpcon
o0h
PRO
1
580
「影響が少ない」を自分の目でみてみる
o0h
PRO
3
1.9k
PHPによる"非"構造化プログラミング入門 -本当に熱いスパゲティコードを求めて- #phperkaigi
o0h
PRO
0
1.7k
もう少しテストを書きたいんじゃ〜 #phpstudy
o0h
PRO
23
5.3k
『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya
o0h
PRO
9
4.2k
色んなオートローダーを覗き見る #phpcon_okinawa
o0h
PRO
5
760
Other Decks in Programming
See All in Programming
分散DBって何者なんだ... Spannerから学ぶRDBとの違い
iwashi623
0
140
社内オペレーション改善のためのTypeScript / TSKaigi Hokuriku 2025
dachi023
1
130
『実践MLOps』から学ぶ DevOps for ML
nsakki55
2
490
ID管理機能開発の裏側 高速にSaaS連携を実現したチームのAI活用編
atzzcokek
0
120
20 years of Symfony, what's next?
fabpot
1
140
dnx で実行できるコマンド、作ってみました
tomohisa
0
120
AIと協働し、イベントソーシングとアクターモデルで作る後悔しないアーキテクチャ Regret-Free Architecture with AI, Event Sourcing, and Actors
tomohisa
5
12k
イベントストーミングのはじめかた / Getting Started with Event Storming
nrslib
1
770
Building AI Agents with TypeScript #TSKaigiHokuriku
izumin5210
5
1.1k
生成AIを活用したリファクタリング実践 ~コードスメルをなくすためのアプローチ
raedion
0
160
CSC305 Lecture 15
javiergs
PRO
0
210
競馬で学ぶ機械学習の基本と実践 / Machine Learning with Horse Racing
shoheimitani
14
14k
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Six Lessons from altMBA
skipperchong
29
4.1k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
YesSQL, Process and Tooling at Scale
rocio
174
15k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.2k
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
A designer walks into a library…
pauljervisheath
210
24k
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 いまアツい知識獲得方法
解決された様子 • 必要なパッケージごとに 「どのソースを取ってくるか」が 解決される • 例) 「不要になったバージョン」 を視覚化するとこんな感じに
解決された様子 • ふぁいなるあんさー!
まとめ
まとめ すごい良い感じにやっててすごい
おしまい! お付き合いいただき ありがとうございました!!