Composer の使い方(その1:概要)
もはや PHP で開発を行う際に、使用していないプロジェクトは探すのが大変なぐらいスタンダードな存在となった Composer ですが、 昨年めでたく 2.0 になったということで、改めて少しまとめてみます。今更とか言っちゃダメです。
Composer とは?
Composer は、PHP の依存関係管理のためのツールです。 世界中のエンジニアが作成してくれたライブラリ(パッケージ)を、あなたの PHP アプリケーションに追加することで、あなたの PHP アプリケーションの開発を容易にしてくれます。
JavaScript でいうところの Node.js の npm のようなものです。 実際、Composer は Node.js の npm と ruby のバンドラーに強く影響を受けているそうです。
大抵のパッケージは、別の特定のパッケージの特定のバージョンに依存しているのですが、 Composer はそれらパッケージの依存関係を考慮して、パッケージのインストールやアンインストールを行ってくれます。
Composer のインストール
Composer の実体は composer.phar という、PHP のアーカイブファイル1つだけです。 つまり、PHP と、この composer.phar というファイルさえあれば動かすことができます。 プロジェクトごとにバージョンが違うと困るというような場合は、グローバルにインストールせず、プロジェクトごとのディレクトリにインストールして使いましょう。
公式サイトのダウンロードページには様々な Composer のインストール方法が記載されています。 Windows インストーラーを使ったものだったり、コマンドラインから composer-setup.php を使ったものだったり、難しそうで混乱してしまいますね。 しかし、心配はいりません。はっきり言って、手動でダウンロードする方法が一番簡単です。 なぜなら、Composer の実体は composer.phar という、PHP のアーカイブファイル1つだけなのですから。
手動でダウンロードする
公式サイトのダウンロードページの「Manual Download」> 「Latest Stable」 のリンクをクリックし、composer.phar ファイルをダウンロードします。以上!終わり!簡単ですね!
実行する
実行する際は、そのダウンロードした composer.phar を PHP から呼ぶだけです。
php composer.phar --version
composer.json と composer.lock
Composer のインストールが終わったのでさっそく使いたいところですが、composer.json と composer.lock ファイルについて触れなければなりません。
composer.json
composer.json は インストールするパッケージの一覧や、Composer の設定などが記載されたファイルです。 Composer でパッケージを管理するには、このファイルが必要になってきますので、まずはこのファイルを作りましょう。
このファイルは インストールするパッケージの一覧や、Composer の設定などが記載されたファイルです。 大抵のパッケージは別のパッケージに依存していますが、その全てのパッケージを手で記載していく必要はありません。 それらの依存パッケージは Composer が自動でインストールしてくれるので、このファイルには本当に必要なパッケージのみを記載します。
このファイルは、手動または init
コマンドで作成する必要があります。
php composer.phar init
require と require-dev
パッケージには、開発環境のみに必要で、本番環境などでは不要なものがあったりします。 そこで composer.json にそれぞれ別々に記載することができます。 常に必要なパッケージは require 、開発時に必要なパッケージは require-dev に記載します。
{ "name": "hoge/hoge", "require": { "monolog/monolog": "^2.2" }, "require-dev": { "phpunit/phpunit": "^9.5" } }
composer.lock
composer.lock は composer.json ととても良く似たファイルですが、 実際にインストールされる(された)全てのパッケージの正確なバージョンの一覧が記載されているという点が異なります。 このファイルは Composer によって自動生成されるので手動で作成する必要はありません(というかきっとできません)。
パッケージはインストールされるタイミングによって、インストールされるバージョンが異なる場合があります。 複数人で開発をしている場合など、全員が同じパッケージの同じバージョンを1つ1つインストールして環境をそろえるのは大変です。
例えば、Aさんがインストールした後に、パッケージがバージョンアップされ、その後にBさんがインストールしたというような場合は、 AさんとBさんの使っているパッケージは微妙に異なってしまいます。 そこで、Aさんがインストールした時点の全てのパッケージの一覧を使ってBさんがインストールすると、AさんとBさんは完全に同じ環境が作成できます。
これを行ってくれるのが composer.lock ファイルです。 composer.lock は、環境を固定化(lock)させるためのファイルです。
パッケージの基本操作
Composer を動かすための準備は終わったので基本操作に行きましょう。
パッケージの追加
パッケージを追加するには composer.json に手動で記載しても良いのですが、
require
コマンドを使用すると、composer.json への追記とパッケージのインストールを同時に行ってくれます。
なので、基本的にコマンドを使用しましょう。
オプション無しで実行すると、そのパッケージは composer.json の require に追加されます。
--dev
オプションを付けて実行すると、そのパッケージは composer.json の require-dev に追加されます。
# require にパッケージを追加 php composer.phar require <package_name>
# require-dev にパッケージを追加 php composer.phar require --dev <package_name>
パッケージの削除
パッケージを削除するには remove
コマンドを使用します。
オプション無しで実行すると、composer.json の require のパッケージが削除されます。
--dev
オプションを付けて実行すると、composer.json の require-dev のパッケージが削除されます。
# require のパッケージを削除 php composer.phar remove <package_name>
# require-dev のパッケージを削除 php composer.phar remove --dev <package_name>
パッケージをまとめてインストールする
composer.json に記載されているパッケージをまとめてインストールするには、install
コマンドを使用します。
オプション無しで実行すると、composer.json の require と require-dev に記載されているパッケージがインストールされます。
--no-dev
オプションを付けて実行すると、require に記載されているパッケージのみインストールされ、
require-dev に記載されているパッケージはインストールされません。
本番環境などで、require-dev に記載されているパッケージは不要な場合は、--no-dev
オプションを付けて実行します。
composer.lock ファイルがない状態で、install
コマンドを実行すると、
composer.json に記載されている全てのパッケージが vendor ディレクトリにインストールされ、
そのパッケージの正確なバージョンが composer.lock ファイルに書き込まれます。
composer.lock ファイルがある状態で、install
コマンドを実行すると、
composer.lock に記載されている正確なバージョンを使用してインストールされます。
# require と require-dev に記載されているパッケージをインストール php composer.phar install
# require に記載されているパッケージのみインストール php composer.phar install --no-dev
パッケージをまとめて最新化する
パッケージを最新バージョンに更新するには、update
コマンドを使用します。
update
コマンドを実行すると、composer.json に記載されているパッケージが最新化され、composer.lock が新しいバージョンで更新されます。
これは、composer.lock ファイルを削除して install
コマンドを再度実行するのと同じです。
php composer.phar update
もし、個別のパッケージのみを最新化したい場合は、その更新したいパッケージの一覧を uptate
コマンドに指定します。
php composer.phar update <package_name> [...]
オートローディング
Composer でパッケージをインストールする方法はわかりました。 では、そのインストールされたパッケージのクラスを、実際に PHP で使うにはどうすればいいでしょうか?
Composer はパッケージのインストールを行った際、vendor/autoload.php というファイルを生成します。 このファイルは、Composer でインストールされたパッケージのファイルを自動で読み込むための PHP のプログラム(オートローダー)が記載されています。 そのため、このファイルを読み込むだけで、インストールしたパッケージの全てのクラスを使用することができるようになります。
<?php // 必要なのはこの1行のみ require __DIR__ . '/vendor/autoload.php'; // Composer でインストールした全てのパッケージのクラスが使用できます $log = new Monolog\Logger('name'); $log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING)); $log->addWarning('Foo');
独自のコードをオートロードする
Composer のオートローダーでは、Composer でインストールしたパッケージの他に、あなたが独自に利用しているライブラリなども自動で読み込むことができます。 この機能を利用すると、読み込み処理を別途記述する必要がなくなるのでとても便利です。 composer.json に autoload という項目を追加すると利用できるようになります。
autoload の項目には、名前空間からディレクトリへのマッピングを記述します。 オートローディングには PSR-0 と PSR-4 が使用できますが、PSR-0 は非推奨ですので、PSR-4 を使用しましょう。 下記の例でいえば、PSR-4 の規約に従って Foo という名前空間のクラスが、library/Foo/ のディレクトリからオートローディングされます。 ちなみにPSRというのは、PHP の標準コーディング規約です。
autoload の項目は、require の項目と同様、開発環境のみに必要で、本番環境などでは不要なものがあったりします。 例えば、単体テストだけで使うコードなどです。 そこで composer.json にそれぞれ別々に記載することができます。 常に必要なオートロードは autoload 、開発時にのみ必要なオートロードは autoload-dev に記載します。
{ "name": "hoge/hoge", "require": { "monolog/monolog": "1.0.*", "guzzlehttp/guzzle": "7.0" }, "autoload": { "psr-4": { "Foo\\": "library/Foo/" } }, "autoload-dev": { "psr-4": { "Bar\\": "library/Bar/" } } }
autoload の項目を変更した際には、vendor/autoload.php を再生成する必要があります。
再生成するには、dump-autoload
コマンドを使用します。
php composer.phar dump-autoload
Packagist
ここまでで、パッケージの基本的な操作方法や、PHP からの利用方法はわかったかと思います。 しかし重要な点に触れていませんでした。
そもそもどんなパッケージが利用できるのでしょうか?
Packagist とは Composer のパッケージの管理を行っているメインのサイト(リポジトリ)です。 Composer のパッケージは、この Packagist からダウンロードされて、インストールされています。 一応、他の場所に登録されたパッケージも Composer でインストールすることはできますが、 基本的にはこのサイトに登録されたパッケージを使うことになるかと思います。
どんなパッケージがあるのか検索したり、またはご自身でパッケージを作って世界に公開したい場合、Packagist を利用しましょう。
Composer 自身の更新
最後に、Composer 自身(つまり、composer.phar)の更新方法も記載しておきます。
self-update
コマンドを使用すると、composer.phar を最新化することができます。
# 現在の composer.phar のバージョンを確認する php composer.phar --version
# composer.phar を最新化する php composer.phar self-update