PHP

【PHP】Composer の使い方

投稿日:2018年7月4日 更新日:

Composer は、PHPのパッケージ管理ツールです。利用するパッケージ(ライブラリ)間の依存関係も解決してくれます。

スポンサードリンク

1. Composer の特徴

  • プロジェクト単位で PHPのライブラリ(パッケージ)を管理します。
  • ライブラリ間の依存関係も解決してくれます。
Composer

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 のまま使用します。

参考: PHP: Phar アーカイブの使用法 – Manual

(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.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 コマンドを使ってインストールすることができます。

Packagist
Packagist

ここでは、Basic usage – Composer にあるのを真似して、monolog/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.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 を参照してください。

9. おわりに

公開されている有名な PHPのライブラリは、ほとんどが Packagist に登録されていますので、Composer を使えば簡単にそれらを利用することができます(それ以外のパッケージでも使えますが)。

また、複数のプロジェクトから利用できるライブラリとして自作のクラスを開発したい場合も、Composer のようなツールを使わないと管理がとても大変なことになります。

Composer は PHP のライブラリ管理ツールのデファクトスタンダードなので、是非とも使えるようになりましょう。

📂-PHP

執筆者:labo


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

PHP

PHP: ob_start() 関数によるバッファリングの動作

PHP の ob_start() 関数によるバッファリングの動作について説明します。

PHPでのエラー処理・例外処理

目次1. PHPの例外クラス2. 例外クラスの使い分け3. 独自アプリ用例外クラスの作成例と利用例4. 資料 1. PHPの例外クラス PHPには以下の例外クラスが組み込まれています。 PHPの例外ク …

PHP

pecl install xxxx する際は、php -v と php-config –version が一致しているか確認してから行う

pecl install xxxx する際は、php -v と php-config –version が一致しているか確認してから行うとよいという話しです。

PHP

PHPって何ができるの?

「PHPって何ができるか?」を知るために、最小限の PHP を使った Webページが Webブラウザにどんなデータを返すのか? を見ていきます。 スポンサードリンク 目次1. この記事が前提としている …

PHP

Composer を使って PSR-4 オートロードしている場合、composer.json は必要なくなる

PHP を使った開発でよく使う Composer に関するお話しです。 例えば、composer.json に以下のように記述して開発を行ったとします。 { … “autoload”: { “ps …