LoginSignup
4
4

More than 5 years have passed since last update.

【Laravel】自作したパッケージの依存パッケージをcomposerがインストールしてくれない

Posted at

【問題】依存パッケージをcomposerがインストールしてくれない

Laravelで自作パッケージを開発し、他アプリから使用できるかどうか確認をしている際に、自作パッケージの依存パッケージがインストールされない、という問題がありました。

作成したパッケージのcomposer.jsonには、以下のように記述しています。ここでは、作成したパッケージではFeedsパッケージが必要であるため、以下の様に記述しました。
dev-masterというのは、masterブランチのパッケージを使用するという意味です。

composer.json
    "require": {
        "willvincent/feeds": "dev-master"
    },

これで、作成したパッケージを使用する親アプリのルートディレクトリでcomposer updateを実行すれば、作成したパッケージが追加されるときに、Feedsパッケージも追加されるようになるはずです。…なるはずなのですが、なぜか追加されません :innocent:

【原因】Composerのスタビリティの設定

Composerにはパッケージを追加する際に、そのパッケージのスタビリティ(そのバージョンが開発版なのか安定版なのか)を判断してダウンロードする仕組みがあります。
例えば、-devは開発中、-rcは公開前、-stableは安定版、というようなキーワードをブランチ名(タグ名)に付けることで、そのバージョンの状態を判断することができます。

※バージョンの例
3.0-dev
2.0-alpha
1.8
1.7

composer.jsonで追加するパッケージのバージョン指定に@devなどのスタビリティフラグを付けることで、例えば「安定版じゃないけど最新のβバージョンが欲しい」というようなときに対応することができます。

composer.json
"require": {
    "vendor/foo": "1.0@beta"
}

そして今回の状況ですが、作成したパッケージであるルートパッケージがdev-masterを要求していて、 それがさらに他のパッケージを要求していました。それぞれの関係を矢印で表すとこのような感じです。

作成したパッケージ→Feedsパッケージ(dev-master)→SimplePieパッケージ

dev-masterはmasterブランチを指定しており、dev-master@devというスタビリティフラグを持っているのですが、今回作成したパッケージを追加しようとしている親アプリではスタビリティをstableに指定していました。つまり安定版のパッケージを追加するようになっていたのです。
そのため、dev-master@stableを参照しようとして見つからず、その結果追加されないという現象が起きていたようでした。

【解決】スタビリティフラグをホワイトリストとして使用する

親アプリのcomposer.jsonに以下のように記述します。

    "require": {
        "allabout/fbn-citrus-core": "dev-r26790_create_rss_validator",
        "willvincent/feeds": "@dev",

ここではFeedsパッケージのバージョン指定はせずに、@devのみとします。
作成したパッケージのcomposer.jsonは変わらずそのままパッケージのバージョン指定をするように記述します。

    "require": {
        "willvincent/feeds": "dev-master"
    },

これにより、無事に作成したパッケージの依存パッケージもダウンロードされるようになりました!
Composerのスタビリティについて大変勉強になりました。

参考にした記事

Composerがパッケージのstabilityを解決するしくみ
http://kohkimakimoto.hatenablog.com/entry/2014/04/04/102125

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4