何を参考にComposerパッケージを選定していますか?
Composerを使用していると、必要な機能を満たすパッケージが複数ある場合、どのパッケージを利用すればよいか、パッケージの選定に頭を悩ませることが多いです。通常はpackagistで表示されるパッケージのダウンロード数やStarの数を目安にしたり、パッケージ自体が頻繁にメンテされているか、Google検索やstackoverflow等のQ/Aサイトで検索したときに事例がたくさんヒットするか...などを目安にすることが多いかと思います。
一方で、せっかく時間を掛けて選定・評価しても、インストール済みパッケージの相性が悪く、コンポーネント間の橋渡しをするGlueCodeが必要で使用を断念する場合もあったりします。
このような場合、Composerのcomposer require
コマンドを使うと良いです。
composer require
は、インストール済みパッケージと一緒に使うことがお勧めな、関連のパッケージを調べることができます。
composer requireを使用してみる
まずは準備として、composer require
コマンドを使用してmonologをインストールしてみます。
また、開発時のみ使うパッケージとしてphpunitもインストールします。
> composer require monolog/monolog
> composer require --dev phpunit/phpunit
次にcomposer suggests
コマンドを実行します。インストールしたmonologとphpunitパッケージと共に利用すると良い、関連パッケージの一覧が表示されます。
> composer suggests
aws/aws-sdk-php
doctrine/couchdb
ext-amqp
ext-mongo
ext-soap
ext-uopz
ext-xdebug
graylog2/gelf-php
mongodb/mongodb
php-amqplib/php-amqplib
php-console/php-console
phpunit/php-invoker
rollbar/rollbar
ruflin/elastica
sentry/sentry
上記の一覧は、開発時のみ使用するphpunitに関連するパッケージまで表示されています。本番環境で使用予定のmonologに関連するものだけ知りたい場合は--no-dev
をつけると、開発用のパッケージは除外して結果が表示されます。
下記の一覧を見ると、ext-xdebugなどの、テスト・デバッグ用パッケージが、おすすめから無くなったことが分かります。
> composer suggests --no-dev
aws/aws-sdk-php
doctrine/couchdb
ext-amqp
ext-mongo
graylog2/gelf-php
mongodb/mongodb
php-amqplib/php-amqplib
php-console/php-console
rollbar/rollbar
ruflin/elastica
sentry/sentry
おススメの理由まで調べる
上記の例では、関連するお勧めパッケージが表示されますが、お勧めの理由が分かりません。
このような場合は、-v
をつけることで推薦理由が表示されます(下記の場合、お勧めの説明文はmonolog/monologパッケージの作者が書いています)。
> composer suggests monolog/monolog -v
monolog/monolog suggests:
- aws/aws-sdk-php: Allow sending log messages to AWS services like DynamoDB
- doctrine/couchdb: Allow sending log messages to a CouchDB server
- ext-amqp: Allow sending log messages to an AMQP server (1.0+ required)
- ext-mongo: Allow sending log messages to a MongoDB server
- graylog2/gelf-php: Allow sending log messages to a GrayLog2 server
- mongodb/mongodb: Allow sending log messages to a MongoDB server via PHP Driver
- php-amqplib/php-amqplib: Allow sending log messages to an AMQP server using php-amqplib
- php-console/php-console: Allow sending log messages to Google Chrome
- rollbar/rollbar: Allow sending log messages to Rollbar
- ruflin/elastica: Allow sending log messages to an Elastic Search server
- sentry/sentry: Allow sending log messages to a Sentry server
指定パッケージに対する関連パッケージだけを調べる
composer suggests
の後にパッケージ名を指定すると、指定したパッケージが推薦するおすすめのみを表示します。
> composer suggests monolog/monolog
aws/aws-sdk-php
doctrine/couchdb
ext-amqp
ext-mongo
graylog2/gelf-php
mongodb/mongodb
php-amqplib/php-amqplib
php-console/php-console
rollbar/rollbar
ruflin/elastica
sentry/sentry
関連パッケージに関する内訳を表示させる
--by-package
オプションをつけると、どのパッケージが何を推薦しているのかの内訳が表示されます。
これを見ると、例えばext-soap
はphpunit/phpunitの関連パッケージではなく、phpunitと一緒にインストールされた依存パッケージのphpunit/phpunit-mock-objectsがお勧めしているパッケージであるといったことが分かります。
> composer suggests --by-package
monolog/monolog suggests:
- aws/aws-sdk-php: Allow sending log messages to AWS services like DynamoDB
- doctrine/couchdb: Allow sending log messages to a CouchDB server
- ext-amqp: Allow sending log messages to an AMQP server (1.0+ required)
- ext-mongo: Allow sending log messages to a MongoDB server
- graylog2/gelf-php: Allow sending log messages to a GrayLog2 server
- mongodb/mongodb: Allow sending log messages to a MongoDB server via PHP Driver
- php-amqplib/php-amqplib: Allow sending log messages to an AMQP server using php-amqplib
- php-console/php-console: Allow sending log messages to Google Chrome
- rollbar/rollbar: Allow sending log messages to Rollbar
- ruflin/elastica: Allow sending log messages to an Elastic Search server
- sentry/sentry: Allow sending log messages to a Sentry server
phpunit/php-code-coverage suggests:
- ext-xdebug: ^2.5.3
phpunit/phpunit suggests:
- ext-xdebug: *
- phpunit/php-invoker: ^1.1
phpunit/phpunit-mock-objects suggests:
- ext-soap: *
sebastian/global-state suggests:
- ext-uopz: *
--by-suggestion
オプションでは、逆に、どのパッケージによっておすすめされているかを逆引きできます。
下記の実行結果を見るとext-xdebugは、phpunit/phpunitとphpunit/php-code-coverageの2つからお勧めされていて、しかもphp-code-coverage側は"^2.5.3"のバージョン指定で推薦している。といったことも分かります。
> composer suggests --by-suggestion
aws/aws-sdk-php is suggested by:
- monolog/monolog: Allow sending log messages to AWS services like DynamoDB
doctrine/couchdb is suggested by:
- monolog/monolog: Allow sending log messages to a CouchDB server
ext-amqp is suggested by:
- monolog/monolog: Allow sending log messages to an AMQP server (1.0+ required)
ext-mongo is suggested by:
- monolog/monolog: Allow sending log messages to a MongoDB server
ext-soap is suggested by:
- phpunit/phpunit-mock-objects: *
ext-uopz is suggested by:
- sebastian/global-state: *
ext-xdebug is suggested by:
- phpunit/php-code-coverage: ^2.5.3
- phpunit/phpunit: *
graylog2/gelf-php is suggested by:
- monolog/monolog: Allow sending log messages to a GrayLog2 server
mongodb/mongodb is suggested by:
- monolog/monolog: Allow sending log messages to a MongoDB server via PHP Driver
php-amqplib/php-amqplib is suggested by:
- monolog/monolog: Allow sending log messages to an AMQP server using php-amqplib
php-console/php-console is suggested by:
- monolog/monolog: Allow sending log messages to Google Chrome
phpunit/php-invoker is suggested by:
- phpunit/phpunit: ^1.1
rollbar/rollbar is suggested by:
- monolog/monolog: Allow sending log messages to Rollbar
ruflin/elastica is suggested by:
- monolog/monolog: Allow sending log messages to an Elastic Search server
sentry/sentry is suggested by:
- monolog/monolog: Allow sending log messages to a Sentry server
--by-package
と--by-suggestion
のオプションは両方指定可能です。共に指定すると両方の結果が出力されます。
> composer suggests --no-dev --by-package --by-suggestion
monolog/monolog suggests:
- aws/aws-sdk-php: Allow sending log messages to AWS services like DynamoDB
- doctrine/couchdb: Allow sending log messages to a CouchDB server
- ext-amqp: Allow sending log messages to an AMQP server (1.0+ required)
- ext-mongo: Allow sending log messages to a MongoDB server
- graylog2/gelf-php: Allow sending log messages to a GrayLog2 server
- mongodb/mongodb: Allow sending log messages to a MongoDB server via PHP Driver
- php-amqplib/php-amqplib: Allow sending log messages to an AMQP server using php-amqplib
- php-console/php-console: Allow sending log messages to Google Chrome
- rollbar/rollbar: Allow sending log messages to Rollbar
- ruflin/elastica: Allow sending log messages to an Elastic Search server
- sentry/sentry: Allow sending log messages to a Sentry server
------------------------------------------------------------------------------
aws/aws-sdk-php is suggested by:
- monolog/monolog: Allow sending log messages to AWS services like DynamoDB
doctrine/couchdb is suggested by:
- monolog/monolog: Allow sending log messages to a CouchDB server
ext-amqp is suggested by:
- monolog/monolog: Allow sending log messages to an AMQP server (1.0+ required)
ext-mongo is suggested by:
- monolog/monolog: Allow sending log messages to a MongoDB server
graylog2/gelf-php is suggested by:
- monolog/monolog: Allow sending log messages to a GrayLog2 server
mongodb/mongodb is suggested by:
- monolog/monolog: Allow sending log messages to a MongoDB server via PHP Driver
php-amqplib/php-amqplib is suggested by:
- monolog/monolog: Allow sending log messages to an AMQP server using php-amqplib
php-console/php-console is suggested by:
- monolog/monolog: Allow sending log messages to Google Chrome
rollbar/rollbar is suggested by:
- monolog/monolog: Allow sending log messages to Rollbar
ruflin/elastica is suggested by:
- monolog/monolog: Allow sending log messages to an Elastic Search server
sentry/sentry is suggested by:
- monolog/monolog: Allow sending log messages to a Sentry server
お勧めパッケージの情報は、どこで定義されているか?
composer suggests
で表示されるは、各パッケージのcomposer.jsonの中にある、suggestセクションに記載されています。
more vendor\monolog\monolog\composer.json
{
"name": "monolog/monolog",
"description": "Sends your logs to files, sockets, inboxes, databases and various web services",
...
"suggest": {
"graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
"sentry/sentry": "Allow sending log messages to a Sentry server",
"doctrine/couchdb": "Allow sending log messages to a CouchDB server",
"ruflin/elastica": "Allow sending log messages to an Elastic Search server",
"php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
"ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
"ext-mongo": "Allow sending log messages to a MongoDB server",
"mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver",
"aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
"rollbar/rollbar": "Allow sending log messages to Rollbar",
"php-console/php-console": "Allow sending log messages to Google Chrome"
},
...
このためcomposer suggests
の情報は、packagistでのインストール実績を元にしたものではなく、元パッケージの作者自身が直接指定したものです。
信頼できるパッケージの作者がお勧めするものは、やはり信頼できるパッケージである可能性は高いので、新たなパッケージの導入予定がなくても、composer suggests
コマンドは一度見ておくことをお勧めします。