PHPでComposerを使っているとき、パッケージの取得をしようとした際にCould not find package...
エラーが表示される場合があります。
今回は、Composerを使っていてパッケージが見つからない時に問題の切り分け方法について説明します。
Could not find package... エラーの出力例
以下は、パッケージ名を間違えて入力したときの出力例です
> composer require monolog/monologggg
[InvalidArgumentException]
Could not find package monolog/monologggg at any version for your minimum-stability (stable).
Check the package spelling or your minimum-stability
require [--dev] [--prefer-source] [--prefer-dist] [--no-progress] [--no-suggest] [--no-update]
[--no-scripts] [--update-no-dev] [--update-with-dependencies] [--ignore-platform-reqs]
[--prefer-stable] [--prefer-lowest] [--sort-packages] [-o|--optimize-autoloader]
[-a|--classmap-authoritative] [--apcu-autoloader] [--] [<packages>]...
Composerでパッケージが見つからないときのチェックポイント
パッケージ名の入力間違いを確認する
まずは、composer require
コマンドや、composer.jsonで指定したパッケージ名に打ち間違いがないか確認します。また、ブランチやタグを指定している場合はこれらの名前に間違いがないかも確認します。
- パッケージ名の打ち間違いについては、パッケージ名の手入力をせずに、packagist.orgのサイトからパッケージ名をコピーペーストして指定してみてください。
- もしくは、composer searchコマンドで、パッケージの情報が検索できるか調べてみてください。
> composer search monolog/monolog
You are running Composer with SSL/TLS protection disabled.
monolog/monolog Sends your logs to files, sockets, inboxes, databases and various web services
kdyby/monolog Integration of Monolog into Nette Framework
adeira/monolog
stackify/monolog Stackify logs and errors for Monolog
thinframe/monolog Monolog Application
weew/app-monolog Integration of the monolog/monolog package into weew/app package.
flowpack/monolog Monolog integration for Flow
...
minimum-stabilityをdevにしてみる
minimum-stabilityパラメータが正しく設定されているか確認します。
問題が発生していないことを確認するために、いったんminimum-stabilityに"dev"を指定して、パッケージが取得できるか確認します。
minimum-stabilityの指定は、composer.jsonに対して以下のような形で指定できます。
{
"minimum-stability": "dev",
"require": {
"monolog/monolog": "^1.0"
}
}
プライベート管理パッケージを使うときのリポジトリ指定を行う
こちらは、packagist.orgに登録していない、プライベートなgitリポジトリなどでパッケージを管理している際のチェックポイントです。
インストールするパッケージ自体は正しく取得できるが、パッケージがさらに依存している孫パッケージが取得ができない場合があります。このような場合、自分が作っているプロジェクトのcomposer.jsonに孫パッケージのリポジトリを記載してください。
Composerの仕様としてpackagist.orgに存在していないパッケージたちは、常にルートパッケージの中に定義されていなければなりません。インストールされているパッケージの依存パッケージが、ローカルのgitなどにある場合は、ルートパッケージ上でgitのリポジトリ定義が必要です。
既存のパッケージをforkしている時の確認
プロジェクトの保存場所にtagとbranchを、すべて同じベンダー名とパッケージ名を使用します。
これは、特にパッケージ名のreplaceを行っていたり、既存のパッケージをフォークしてカスタマイズ・メンテナンスしている場合も含まれます。
リリース直後のパッケージが取得できないときは数分待つ
もし、バージョンアップされたばかりのパッケージをComposer経由で取得したい場合は、しばらく待つ必要があります。
github等でパッケージの最新バージョンをpushしても、Packagistは直ぐにチェックするわけではなく、バージョン更新のwebhookを受け取ってから更新内容を確認するのに最大1分ぐらいの時間が掛かります。
--with-dependenciesオプションを使って更新してみる
1つのパッケージを更新する場合、パッケージが新しいバージョン自体に依存することがあります。
この場合、--with-dependencies引数を追加して依存パッケージも含めた更新を行うか、更新が必要なすべての依存関係をcomposertコマンドに追加します。