PHP入門 外部ライブラリ(Composer)
PHPでは、標準であまたの関数/クラスライブラリが用意されているというだけではありません。本家以外の開発者が拡張ライブラリをさまざまに提供しており、目的特化した機能をシンプルなコードで実装できます。
Composerは、これら拡張ライブラリ(パッケージ)をインストールするためのパッケージ管理ツールです。PHPライブラリを追加する場合、動作に必要な.phpファイルを手動で配置してもかまいませんが、パッケージ管理ツールを利用することで、次のメリットが得られます。
1、インストール/アンインストールをコマンド1つで行える
Composerを利用することで、パッケージのインストール/アップグレード/アンインストールをコマンド1つで自動化できます。パッケージよっては、動作するために他のパッケージを要求する、いわゆる依存性がある場合があります。シンプルなパッケージであればとくかく、依存性が複雑になってくると手動で解決するのは困難なため、Composerを利用することで依存性を自動的解決してくれます。さらに、アプリで利用するパッケージをあらかじめ定義ファイルとして準備しておくことで、インストールすべきパッケージが増えた場合に、まとめてインストールすることも可能です。
2、アプリ単位にパッケージを管理する
一世代前に普及していたパッケージ管理ツールとして、PEARがあります。PEARは、既定ですべてのパッケージをプラットフォーム共通で管理していました。この手法では、一度、パッケージをインストールすれば、すべてのアプリでパッケージを共有できるというメリットがあります。反面、異なるアプリで「同じパッケージの異なるバージョン」を同居させるのは困難です。特にアプリが特定のバージョンに依存しているケースでは、ライブラリ管理を煩わしいものにす原因ともなっていました。一方、Composerのパッケージ管理はアプリ単位です。よってアプリ動詞で「同じライブラリの異なるバージョン」を利用していたとしてもお互いに影響することはありません。また、アプリコードとライブラリを1つのフォルダ内でまとめて管理できるメリットもあります。
3、ライブラリの自動ローディング機能を利用できる
Composerでは、クラスの自動ロードに対応しています。これを利用することで、クラスライブラリをいちいち個別にインポートしなくても、必要に応じて自動で有効化できます。特に、プログラムから直接呼び出していないライブラリなどはわかりにくく、インポートも忘れやすいです。
4、対応するライブラリが豊富である
Composerに対応したライブラリは、30万以上にも及びます。現在、PHP界隈で利用されている主要なライブラリの大部分は、Composer経由で提供されています。
Packagist(https://packagist.org/)から確認することができます。
Composerのインストール
Windows環境
ダウンロードページ(https://getcomposer.org/download/)の[Windows Installer]からComposer-Setup.exeをダウンロードし、入手したファイルをダブルクリックします。
インストーラーが起動し、インストールモードを訊かれるので「Install for all users(recommended)」(すべてのユーザー向けのインストール)をクリックします。
「ユーザーアカウント制御」ダイアログが表示された場合は、「はい」を選択します。
InstallationOptionsダイアログで「Developer mode」にチェックした場合は、アンインストーラーがインストールされないため、チェック付けずにインストールします。
Settings Checkダイアログでは、Composerで利用するphp.exeへのパスを指定します。
Proxy Settingsダイアログでは、プロキシサーバーを使用している場合のみ、「Use a proxy」にチェックを付けてアドレスを指定します。
Installボタンをクリックします。
Nextボタンをクリックします。
「Finish」ボタンをクリックします。
VSCodeを利用している場合は、VSCodeを再起動します。
Composerのインストールを確認する
以下のコマンドでComposerが正しくインストールされているか確認します。
>composer -v
ライブラリのインストール
個別のライブラリ「Guzzle」をインストールしてみます。
composer require guzzlehttp/guzzle "~7.3.0"
「guzzlehttp/guzzle」はライブラリ名、「~7.3.0」はバージョン番号です。ライブラリ名は、Packagistから確認できます。バージョン番号は「7.3.0」のように決め打ちでもかまいまぜんが、「~以上~未満」のような幅を持たせることもできます。「~」であれば「7.3.0以上7.4.0未満」の範囲で最新バージョンをインストールしなさいという意味になります。
バージョン表記で利用できる記号
利用例 | 意味 |
---|---|
~1.2.0 | 1.2.0以上、1.3.0未満 |
^1.2.0 | 1.2.0以上、2.0.0未満 |
1.2.* | 1.2.0以上、1.3.0未満 |
* | 現在の最新バージョン |
バージョン番号は「メジャーバージョン.マイナーバージョン.バッチ番号」で表現
バッチ番号は、バグフィックスなどの微小な変更で、機能追加はありません。マイナーバージョンアップは、機能追加を伴いますが、互換性は維持されます。メジャーバージョンアップは互換性が保たれない可能性がある破壊的な変更を意味します。
たくさんのフォルダ/ファイルが生成されますが、利用にあたってこれらを意識する必要はありません。というもの、Composerでは/vendorフォルダ配下にautoload.phpをインクルードするだけで、あとは必要なファイルを自動ロードしてくれます。
アプリで扱うライブラリ情報を管理する(composer.json)
composer.jsonはパッケージ定義ファイルと呼ばれ、現在のアプリで利用するライブラリの情報が記録されています。composer requireコマンドを実行した時に自動で生成されます。
composer.jsonを編集することも可能です。例えば、HTML Purifierを追加した例です。
次のコマンドでライブラリ更新(不足分は追加する)することができます。
composer update
composer.jsonを利用することで、異なるコンピューターでも即座にライブラリをインストールできます。composer.jsonをアプリルートに配置した状態、次のコマンドを実行します。
composer install
これで、composer.jsonに定義されたライブラリ情報に基づいて、必要なライブラリを一括でインストールしてくれます。
composer.lockの役割
composer.jsonによく似たファイルで、composer.lockがあります。
composer.lockとは、インストールのタイミングでcomposer.jsonの内容を解析し、実際にインストールされたバージョンを管理しています。Composerによって管理されるファイルなので、開発者が編集することはありません。
composer.lockがある場合にはその情報に基づいて、ない場合はcomposer.jsonを見てライブラリをインストールします。つまり、特定のタイミングでインストールされたライブラリを忠実に再現します。一方、composer updateコマンドはcomposer.jsonの記述を優先します。つまり、「^」「~」「*」などのバージョン表記がある場合には、以前インストールしたよりも新しいバージョンがインストールされる可能性があります。そのため、インストールすべきライブラリのバージョンを完全に再現したい場合は、composer.json/composer.lockの双方を共有して、composer installコマンドを利用したほうがよいでしょう。
composerコマンドのその他のサブコマンド
composerコマンドでは、require/install/updateの他に次のようなサブコマンドが用意されています。
composerコマンドの主なサブコマンド
コマンド | 概要 |
---|---|
composer require –dev package | 指定されたライブラリpackageを開発専用としてインストール |
composer self-update | Composer自身を更新 |
composer validate | composer.jsonに誤りがないか検証 |
composer search name | 指定された名前nameにマッチするライブラリの情報を取得 |
composer show -i | インストール済みライブラリpackageの情報を表示 |
composer show -p | プラットフォームパッケージ(PHP拡張)の情報を表示 |
composer show package | 指定されたライブラリpackageの情報を表示 |
composer requireコマンドの–devオプションは、開発時にだけ利用するライブラリをインストールするために利用します。–devオプション付きでインストールされたライブラリは、composer.jsonでもrequire-devキー配下で管理されます。
このように開発向けライブラリと実行向けライブラリを区別しておくことで、あとで別環境でインストールする際に開発向けライブラリだけを除外するということが可能になります。具体的には、次のコマンドを実行します。
>composer install --no-dev