[PHP]Composerの使用パッケージ選定は`composer suggest`を使うと便利

カテゴリ: composer

何を参考に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コマンドは一度見ておくことをお勧めします。


Amazonでおトクに買い物する方法
AmazonチャージでポイントGET


Amazonは買いもの前にAmazonギフト券をチャージしてポイントをゲットしないと損!

こちらもおススメ

コメントを残す

メールアドレスが公開されることはありません。