Composerでパッケージ管理する上でおさえておきたい知識について取り上げます。
Composerは、PHP向けのパッケージ(ライブラリ)管理ツールです。かつては、ライブラリ管理としてPEARがよく使われてきましたが、現在ではComposerが一般的に利用されています。
PEARはシステム全体でパッケージが適用されるので複数のプロジェクトを同一環境で扱うとパッケージが共有されてしまいます。それに対し、Composerはプロジェクトごとにパッケージを管理することができます。
Composerをインストール
curlでダウンロードできます。
$ curl -sS https://getcomposer.org/installer | phpダウンロード後、以下のようにバージョン確認できます。
$ php composer.phar -V
Composer version 1.7.3 2018-11-01 10:05:06どのディレクトリからでもcomposerを利用できるようにしておきます。
$ sudo mv composer.phar /usr/local/bin/composer
$
$ composer -V
Composer version 1.7.3 2018-11-01 10:05:06設定ファイル作成
composer.json という設定ファイルを作成し、そのファイル内に利用したいパッケージ情報を記述します。
ここでは、以下のように記述しました。
{
"require": {
"pear/log": "*"
}
}pear/logというパッケージの最新バージョンを利用したいという意味になります。
バージョン指定方法
一般的なサフィックスは以下のようになります。
| サフィックス | 概要 |
|---|---|
-dev | 開発中 |
-rc | 公開前 |
-stable | 安定版 |
バージョンの指定方法などは、下記サイトで詳しく説明してくださっています。
→ [初心者向け] composerのバージョン指定方法
パッケージの検索方法
利用したいパッケージの名称がわからないときは、https://packagist.org/にアクセスして検索します。
requireとrequire-devの違い
requireは必ず必要なパッケージを指定します。require-devは開発用だけで必要なパッケージを指定(phpunitなど)します。
パッケージインストール
composer.json が存在するディレクトリで以下コマンドを実行します。
$ composer installすると、パッケージのインストールが始まり、composer.lock と vendorフォルダ が作成されました。
$ ls
composer.json composer.lock vendorcomposer.lock
composer.lockには、インストールしたパッケージ情報が記載されてます。
composer installを実行するとcomposer.lockに基づいてパッケージをインストールします。初回はcomposer.lockがないので、composer.jsonに基づいてcomposer.lockが作成されたうえでパッケージがインストールされます。
今後、composer.jsonにパッケージを追加した際には、composer updateを実行させます。追加したパッケージがインストールされcomposer.lockも更新されます。
composer installはcomposer.lockから判断してパッケージをインストールするので、composer.jsonを更新してもcomposer installですと新規インストールはされない点に気をつけます。
vendorフォルダ
vendorフォルダにはインストールしたパッケージが格納されます。
$ ls vendor/
autoload.php composer pearvendorフォルダ配下にあるautoload.phpをプログラムで読み込むだけでライブラリを利用することができます。
パッケージの利用
Composerでインストールしたパッケージを読み込んでプログラムを実行させてみます。index.php を作成します。処理は以下のようにします。
<?php
require_once(realpath(__DIR__) . '/vendor/autoload.php');
$filename = realpath(__DIR__) . '/app.log';
$logFile = Log::factory('file', $filename, 'test');
$logFile->log('エラー', PEAR_LOG_ERR);実行すると、app.logというファイルが生成され、pear/logが利用できていることを確認できます。
$ php index.php
$ ls
app.log composer.json composer.lock index.php vendor
$ cat app.log
Nov 25 11:28:07 test [error] エラー本番環境への配布
今回は、開発環境でcomposer installを実行してパッケージをインストールしました。
本番環境に設置するには、下記2つの方法が考えられます。
- 今回作成した
vendorフォルダをそのままアップ。 composer.jsonを本番環境にアップ後、本番環境上でcomposer installを実行する。
通常、2の方法で本番環境に設置します。
開発環境のみで利用するパッケージをrequire-devで指定している場合は、2の方法でインストールする場合に注意が必要です。
composer installはオプションなしですと、requireとrequire-devの両方ともインストールしてしまいます。本番環境では、require-devで指定しているパッケージは必要ないのでcomposer install –no-devとオプションをつけてインストールします。
オートロード機能
Composerは、オートロード機能(自動でクラスファイルを読み込む機能)を提供しています。オートロード機能には、psr-4 classmap filesといった方法があります。
名前空間 | PSR-4
psr-4では、「名前空間」と「composer.jsonの存在するディレクトリからの相対パス」の対応付けを行います。
下記例では、Appから始まる名前空間のクラスへアクセスした際に、appディレクトリ配下から対応するクラスファイルを探してロードします。
"autoload": {
"psr-4": {
"App\\": "app/"
}
},なお、autoloadセクションを編集した場合、下記コマンドを実行して変更を反映させる必要があります。
$ composer dump-autoloadPHPバージョン指定
本番環境のPHPバージョンと違う環境でインストールしたい場合、以下のように設定します。
{
"config": {
"platform": {
"php": "5.5.9"
}
}
}上記指定によって、どの環境でも5.5.9としてインストールしてくれます。
トラブルシューティング
self-update
Composerを利用していると下記のように警告が表示されるときがあります。
Warning: This development build of composer is over 60 days old. It is recommended to upda
te it by running "C:\ProgramData\ComposerSetup\bin\composer.phar self-update" to get the l
atest version.60日以上アップデートしていないという警告です。composer self-updateを実行しcomposer自体を最新にアップデートします。
ローカルキャッシュ削除
インストールされずに、vendor配下に空のリポジトリフォルダだけできるときがあります。
このようにうまく動作しないときには、ローカルキャッシュを削除すると解決される場合があります。
キャッシュは以下コマンドで削除できます。
$ composer clear-cache途中で止まる
OOM(Out Of Memory) Killerによって、プロセスが強制終了された可能性があります。OOM Killerは、メモリもスワップも枯渇したとき、適当にプロセスを選んで,強制終了させます。
下記情報など参考にしてみてください。
teratail | Composer – パッケージをインストールしている最中に止まる件です
パッケージ取得が遅い
調査方法
パッケージ取得時に、profileオプションを利用すると、タイムとメモリ使用量が表示されます。
$ composer update --profile対策 日本国内のミラーサーバからインストールする
hirakさんが作成した日本国内のサーバーからインストールするようにします。
// 確認
$ composer config --list|grep packagist.org.url
[repositories.packagist.org.url] https?://packagist.org
// packagistを変更
$ composer config -g repos.packagist composer https://packagist.jp
// 反映されたか確認
$ composer config --list|grep packagist.org.url
[repositories.packagist.org.url] https://packagist.jp元に戻す場合、以下のようにします。
$ composer config -g --unset repos.packagist対策 prestissimoを利用して並列ダウンロード
同じく、hirakさんが作成したprestissimoを利用するとさらに速くなります。並列ダウンロードしてくれるようです。
$ composer global require hirak/prestissimo