composerのrepositoriesは再帰的に読まれない
composerのドキュメントをよくよく読んでみると書かれていることなんだけど、composer.jsonのrepositoriesは再帰的に読まれないので注意が必要。
Repositories are only available to the root package and the repositories defined in your dependencies will not be loaded. Read the FAQ entry if you want to learn why.
Why can't Composer load repositories recursively? Composer
repositoriesを使うことは、少なくともオープンソースでライブラリを公開している限りではあまりないだろうし、大抵のライブラリはgithubにおいて、packagistに登録することが多いので、まあ困らないんだけど、プライベートなリポジトリをsatisなどを使って参照していると、プライベートなライブラリがさらにプライベートなライブラリに依存することがあって、ばっちりとこの問題にはまったりする。
細かいところまで読み込んでいないんだけど、残念なことにsatisを使ってもこの問題を解決できなかった。いい方法があるのかもしれないけど、ちょっとわかっていない。
とても単純に解決する方法としては、依存しているライブラリのリストを一番上の層のcomposer.jsonに書いてしまうことだ。
{ "library": "dev-master", "component": "dev-master" }
component
がlibrary
に依存している場合の例。component
のcomposer.json
にはlibrary
への依存が書いてあるとする。
このようにすると、ライブラリの依存関係解決がうまく行われて、dev-masterが見つからないとかいわれなくて済む。 けど普通に考えてこんなの絶対おかしいわけで、何とかならないのかなーと思うのでした。