phpのコーディングをする上で、
ライブラリ使用のデファクトスタンダードとなっているcomposerについて、使い方や概念をまとめた。
1. Composer とは

composerとは、簡単に言うと、PHPのパッケージ依存管理ツールだ。パッケージ依存管理ツールという名前からわかるように、PHPの開発で使用するライブラリ(パッケージ)をまとめて管理するために使うツールのことだ。
”依存の管理”とは何かと言うとライブラリ同士の相互関係を指している。
例えば、ライブラリAを使いたい場合に同時にライブラリBもインストールする必要があるとき、ライブラリAはライブラリBに依存していると言える。ツールを使わずにライブラリを管理する場合は、このような依存関係を全て自分で把握して解決する必要がある。
しかし、Composerのようなパッケージ依存管理ツールを使用することで、ライブラリAの使用を宣言するだけで自動的にライブラリBがインストールされるといった風に依存関係を自動で解決してくれると言ったことが可能となり、開発者の負担を大きく軽減してくれることが最大のメリットである。
- PHPのパッケージ依存管理ツール。
- 依存管理ツールは、ライブラリ間の依存関係を解決してくれる。
2. composer が対応している PHP バージョン
composerが対応しているPHP のバージョンは以下
PHP 5.3.2以上
3. Composer のインストール方法
Composerのインストールは、以下のコマンドを実行して行う。
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
Composerインストーラのダウンロード
まず、composer をインストールするためのPHPファイルを、以下コマンドでダウンロードする。
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
上記は、php コマンドの -r オプションを使い、引数として与えた PHPコードをその場で実行させている。これ以降のコマンドも全て同じで、全ての処理を PHPのコードを使って行う。
Composer をインストール
Composerインストーラをダウンロードできたら、以下コマンドでComposer をインストールする。
php composer-setup.php
以下のように表示されれば問題ない。
カレントディレクトリに composer.phar というファイルが作成される。
All settings correct for using Composer
Downloading...
Composer (version X.X.X) successfully installed to: [パス]/composer.phar
Use it: php composer.phar
作成された composer.phar というファイルが composer コマンドだ。
拡張子 .phar は、PHPのアーカイブファイルのこと。
composer コマンドの実体は、この composer.phar ファイルだ。
参考: PHP: Phar アーカイブの使用法 – Manual
以上の作業で、カレントディレクトリに composer コマンド (composer.phar) がインストール完了だ。
4. 設定ファイル(composer.json)の書き方
Composerでは、設定ファイルに composer.json というファイルを使用する。
composer.jsonというファイルを、プロジェクトの最上位ディレクトリに作成し、その中にComposer に関する設定を記述する。 composer コマンドは、このファイルを参照して動作する。
composer.json
使用パッケージと、バージョン指定
導入する「パッケージ名」と「パッケージのバージョン」を、composer.json に記述する。
プロジェクトで利用するライブラリの「パッケージ名」と「そのパッケージのバージョン」を以下のように記述する。
{
"require": {
"パッケージ名": "バージョン"
}
}
パッケージ名
パッケージ名は、「ベンダー名/プロジェクト名」というフォーマットになっている。
例えば、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.lock ファイルにはインストールされたパッケージのバージョンが記述されている。
このファイルが既に存在しているディレクトリで、composer install コマンドを実行すると、ここに記述されたバージョンがインストールされるようになっている
# composer.lockに記載のライブラリバージョンをインストール
composer install
※composer.json 内では、^1.2.3 といったバージョン指定ができるが、composer.lock 内のバージョンが優先される。
そのため、特に GitHub などのバージョン管理ツールを使っている場合では、composer.lock ファイルもレポジトリ管理することによって、開発者全員が同じバージョンのパッケージを利用することができるようになる。
※尚、composer update コマンドを実行すると composer.json 内で指定したバージョンの範囲内でパッケージの更新が行われ、composer.lock ファイルも更新されます。
6. Composerの、基本的な使い方
ここまで学んできたことを理解する意味も兼ねて、
実際にComposerを使って、何かパッケージを導入してみる。
(1) プロジェクトのディレクトリに移動
ここでは、プロジェクトディレクトリを path/to/project1 とする。
cd path/to/project1
(2) 設定ファイル composer.json を生成
composer initコマンドを実行して、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 についてのページが開いた。
このパッケージについてのいろいろな情報が表示されている。
最新バージョンは、2.3.4 だ(検索時点)。
(4) composer.json ファイルに、導入するパッケージ情報を記述する。
composer.json ファイルを手動で編集し、
以下のように monolog/monolog パッケージを登録する。
ここでは、後方互換性さえ維持できればよいと考え、
「バージョン」の部分は「^2.3.4 」と記述することにする。
{
"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';
先程、./composer.phar installコマンドでライブラリをインストールした時に、
実は、 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.json に記述されたパッケージをインストールする。 • composer.lock がある場合は、その中で指定されたバージョンをインストールする。 |
composer update [パッケージ名] |
• composer.json に指定されたバージョンの範囲で、パッケージを最新版に更新する。 •composer.lock も更新する。 |
composer self-update |
• composer 自体を最新版にアップデートする。 |
composer search 文字列 |
• パッケージを検索する。 |
composer show パッケージ名 |
• 指定したパッケージの詳細を表示する。 |
composer validate |
• composer.json の文法チェックを行う。 |
詳しくは、Command-line interface / Commands – Composer を参照。
関連記事