Composer は、PHPのパッケージ管理ツールです。利用するパッケージ(ライブラリ)間の依存関係も解決してくれます。
目次
1. Composer の特徴
- プロジェクト単位で PHPのライブラリ(パッケージ)を管理します。
- ライブラリ間の依存関係も解決してくれます。
2. 対応している PHP のバージョン
- PHP 5.3.2以上
3. Composer のインストール
ここでは、カレントディレクトリに composer
コマンド (composer.phar
) を生成する手順を説明します。この作業が「Composer のインストール」作業となります。
手順
以下のコマンドを順番に実行するだけです。
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
以下、各コマンドが何をやっているのかについて簡単に解説しておきます。
(1) まず、composer をインストールするためのPHPファイルをカレントディレクトリに生成します。
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
ちなみにこのコマンドは、php
コマンドの -r
オプションを使い、引数として与えた PHPコードをその場で実行させています。これ以降のコマンドも全て同じで、全ての処理を PHPのコードを使って行います。
(2) 生成したPHPファイルが改ざんされていないかチェックします。
php -r "if (hash_file('SHA384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
“Installer verified” と表示されたら問題ありませんので、次へ進みます。”Installer corrupt” と表示された場合は、正常のファイルが生成されていませんので、もう一度 (1) の作業からやり直してください。
93b5449639...a0806388a8
」は、Composer v1.8.0 の場合の文字列です。”Installer corrupt” と表示された場合は、Composer のバージョンが更新された可能性もありますので、その時は Download Composer ページで新しい文字列を確認してください。(3) 生成したPHPファイルを実行して、composer をインストールします。
php composer-setup.php
以下のように表示されれば問題ありません。カレントディレクトリに composer.phar
というファイルができているはずです。
All settings correct for using Composer
Downloading...
Composer (version 1.8.0) successfully installed to: /home/foo/public_html/composer.phar
Use it: php composer.phar
この composer.phar
というファイルが composer コマンドです。
.phar
は、PHPのアーカイブファイルです。複数のPHPファイルをまとめることができます。
composer
コマンドの実体は、この composer.phar
ファイルなのですが、ファイル名から拡張子を削除して利用することも多いです。どちらでも構いません。本ページでは、composer.phar
のまま使用します。
(4) composer-setup.php
ファイルはもういらないので削除します。
php -r "unlink('composer-setup.php');"
以上の作業で、カレントディレクトリに composer コマンド (composer.phar
) がインストールできました。
インストールの過程でこのファイルには実行権限が与えられていると思いますので、以下のようにすぐに実行できるはずです。引数なしで実行すると、ヘルプが表示されます。一度、実行してみましょう。
./composer.phar
参考
補足情報:Composer 2 について
近々、Composer バージョン2 がリリースされるそうです。
現時点 (2020年4月) でも、以下のコマンドで バージョン2 が使えます。
composer self-update --snapshot
4. 設定ファイルの書き方
プロジェクトの最上位ディレクトリに composer.json
という設定ファイルを作成し、その中にComposer に関する設定を記述します。 composer
コマンドは、このファイルを参照して動作します。
パッケージのバージョン指定
プロジェクトで利用するライブラリの「パッケージ名」と「そのパッケージのバージョン」を以下のように記述します。
{
"require": {
"パッケージ名": "バージョン"
}
}
導入する「パッケージ名」と「そのパッケージのバージョン」を、composer.json
に記述します。パッケージ名は既に monolog/monolog
であると分かっていますが、バージョンは何を指定すればよいのでしょうか?
パッケージ名
パッケージ名は、「ベンダー名/プロジェクト名」というフォーマットになっています。
例えば、psr/log
というパッケージ名であれば、psr
がベンダー名で “log” がプロジェクト名です。
バージョン
Composer でインストールするライブラリのバージョンは、以下のように3つの数字がピリオドでつなげられたフォーマットになっています。
それぞれの意味を表にしました。
位置 | 名前 | 説明 |
---|---|---|
左端の数字 | メジャーバージョン | 後方互換性が維持されない機能を追加した場合に、数字が増えます。 |
真ん中の数字 | マイナーバージョン | 後方互換性を維持した機能を追加した場合に、数字が増えます。 |
右側の数字 | パッチバージョン (メンテナンスバージョン) |
バグフィックスなどを追加した場合(後方互換性を維持している)に、数字を増やす。 |
※「後方互換性」というのは、「以前のバージョンで動いていた部分は、新しいバージョンでもそのまま動く。」ということを意味しています。
例えば 1.2.3 というバージョンに対して、後方互換性を維持した新機能を追加したのであれば、1.3.0 というバージョンになります(パッチバージョンは 0 に戻ります)。また、1.2.3 に対して、後方互換性を壊すような新機能を追加したのであれば、2.0.0 というバージョンになります(マイナーバージョンもパッチバージョンも 0 に戻ります)。
バージョンの指定方法
そして、バージョン指定の書き方ですが、もちろん「1.2.3」のように完全なバージョンを指定することもできます。
しかし、
とか
といった場合に、それに対応した書き方が用意されています。こちらの指定方法であれば、composer update
コマンドを実行すると、指定した表記の範囲内で最新のバージョンに更新させることができます。
詳しくは、Versions and constraints – Composer あたりを参照して欲しいのですが、ここでいくつか簡単な例をご紹介します。
バージョンの記述 | 意味 |
---|---|
~1.2 |
1.2 以上、2.0.0 未満(2.0.0 にはならない)(後方互換性を維持する) |
~1.2.3 |
1.2.3 以上、1.3.0 未満(1.3.0 にはならない)(新機能の追加も許さない) |
^1.2.3 |
1.2.3 以上、2.0.0 未満(2.0.0 にはならない)(後方互換性を維持する) |
^0.3.2 |
0.3.2 以上、0.4 未満(0.4 にはならない)(新機能の追加も許さない) |
※ 「~
(チルダ)」は、指定した最後の数字のみ更新を許可する。
※ 「^
(キャレット)」は、後方互換性を維持する範囲で更新される(但し、バージョンが 1未満の場合はパッチバージョンの更新のみ許可する)。
5. composer.lock ファイル
Composer を使ってパッケージをインストールすると、カレントディレクトリに composer.lock
というファイルが生成されます。
このファイルにはインストールされたパッケージのバージョンが記述されています。
このファイルが既に存在しているディレクトリで、composer install
コマンドを実行すると、ここに記述されたバージョンがインストールされるようになっています(composer.json
内では、^1.2.3
といったバージョン指定ができますが、composer.lock
内のバージョンが優先されます)。
そのため、特に GitHub などのバージョン管理ツールを使っている場合では、composer.lock
ファイルもレポジトリ管理することによって、開発者全員が同じバージョンのパッケージを利用することができるようになります。
尚、composer update
コマンドを実行すると composer.json
内で指定したバージョンの範囲内でパッケージの更新が行われ、composer.lock
ファイルも更新されます。
6. 基本的な使い方
実際に何かパッケージを導入してみましょう。
(1) プロジェクトのディレクトリに移動します。
ここでは、プロジェクトディレクトリを path/to/project1
とします。
cd path/to/project1
(2) 設定ファイル composer.json
を生成します。
以下のコマンドを実行して、composer.json
ファイルを生成します。
./composer.phar init -q
※ -q
オプションを指定しない場合、その場でいろいろと設定内容について尋ねられ、答えた内容がファイルに書き込まれます。今回はこの後で手動で記述しますので、-q
オプションを付けて 空の composer.json
ファイルを生成させています。
※ composer.json
ファイルは、必ずしもこのコマンドで生成する必要はありません。
(3) Packagist でパッケージを探します。
Packagist というウェブサイトで、PHPのライブラリ(パッケージ)を探します。ここにあるライブラリは、composer コマンドを使ってインストールすることができます。
ここでは、Basic usage – Composer にあるのを真似して、monolog/monolog
というパッケージを導入してみようと思います。これは、ロギングを行うためのライブラリです。
画面上部の検索フィールドに、”monolog” と入力すると、パッケージの候補がいくつも表示されますが、下画面では一番上に「monolog/monolog」が表示されています。その部分をクリックしましょう。
monolog/monolog
についてのページが開きました。このパッケージについてのいろいろな情報が表示されています。最新バージョンは、1.23.0 であるようです。
(4) composer.json
ファイルに、導入するパッケージ情報を記述します。
composer.json
ファイルを手動で編集し、以下のように monolog/monolog
パッケージを登録します。
ここでは、後方互換性さえ維持できればよいと考え、「バージョン」の部分は「^1.23.0」と記述することにしました。
{
"require": {
"monolog/monolog": "^1.23.0"
}
}
(5) composer.json
ファイルに記述したパッケージをインストールします。
以下のコマンドを実行すると、composer.json
に記述したパッケージがインストールされます。
./composer.phar install
通常はカレントディレクトリ直下の、vendor
というディレクトリにインストールされます。
今後、以下のコマンドを実行すれば、指定したバージョンの範囲で最新版に更新することができます。
./composer.phar update
(6) ライブラリを使う
main.php
というファイルを生成し、monolog/monolog
パッケージを利用した以下のコードを記述して保存します。
<?php
require __DIR__ . '/vendor/autoload.php';
$log = new Monolog\Logger('name');
$log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING));
$log->warning('Foo');
あとは、このPHPファイルを実行してみましょう。
php main.php
特に問題がなければ、カレントディレクトリに app.log
ファイルが生成され、そこに “Foo” を含んだ警告メッセージが書き込まれているはずです。
2行目について
require __DIR__ . '/vendor/autoload.php';
先程、monolog/monolog
をインストールした時に、実は vendor/autoload.php
というファイルも生成されていました。Composer を使ってインストールしたライブラリは、最初にこの vendor/autoload.php
ファイルを読み込ませるだけで使えるようになります。これは、Composer の大きなメリットです。
4行目について
$log = new Monolog\Logger('name');
ここで、いきなり Monolog\Logger
というクラスを使っています。しかし既に vendor/autoload.php
を読み込んでいるので、vendor
ディレクトリ内に配置された monolog/monolog
パッケージ内のクラスを利用できるのです。
参考
7. 独自に開発したクラスを利用する
Composer を使うと、Packagist に登録されたライブラリだけでなく、自分で作った PHPのクラスも簡単に利用することができます。
PHP-FIG というグループが、PHPの「オートローダー (Autoloader)」についての仕様を策定しているのですが、Composer はこの仕様に対応しています。PSR-4 という仕様です。
例
では、Hello.php
ファイルに Hello というクラスを定義しておき、main.php
ファイル内から利用する例を説明します。
ファイルとディレクトリの階層は、こんな感じです。
composer.json
src/
└ main.php
mylib/
└ Hello.php
それぞれのファイルの内容は以下のようになります。
composer.json
{
...
"autoload": {
"psr-4": {"App\\": "mylib/"}
},
...
}
- “mylib/” ディレクトリを、”App” という名前空間にマッピングしますよと指示しています。
src/main.php
<?php
require __DIR__ . '/../vendor/autoload.php';
$helloObj = new \App\Hello();
$helloObj->say();
composer.json
に記述したマッピングにより、\App\Hello
と書くと、「”mylib” ディレクトリ内の Helloクラス」であると判断して呼び出してくれます。
mylib/Hello.php
<?php
namespace App;
class Hello {
public function say()
{
echo "Hello!\n";
}
}
mylib
ディレクトリはApp
という名前空間にマッピングされているので、namespace App;
と記述します。
以上を記述したら、独自に追加したパスを Composer に認識させるために以下のコマンドを実行します。
./composer.phar dump-autoload
※ これにより、./vendor/composer/autoload_psr4.php
内に、App
名前空間とmylib
ディレクトリのマッピング情報が書き込まれます。
では、main.php
を実行してみましょう。
php ./src/main.php
Hello!
“Hello!” と表示されるはずです。
8. 主な composer
サブコマンド
composer
コマンドには、いろいろなサブコマンドが定義されています。
主なサブコマンドについて説明します。
コマンド | 説明 |
---|---|
composer install |
|
composer update [パッケージ名] |
|
composer self-update |
|
composer search 文字列 |
|
composer show パッケージ名 |
|
composer validate |
|
詳しくは、Command-line interface / Commands – Composer を参照してください。
9. おわりに
公開されている有名な PHPのライブラリは、ほとんどが Packagist に登録されていますので、Composer を使えば簡単にそれらを利用することができます(それ以外のパッケージでも使えますが)。
また、複数のプロジェクトから利用できるライブラリとして自作のクラスを開発したい場合も、Composer のようなツールを使わないと管理がとても大変なことになります。
Composer は PHP のライブラリ管理ツールのデファクトスタンダードなので、是非とも使えるようになりましょう。