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 vendor
composer.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 pear
vendorフォルダ配下にある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-autoload
PHPバージョン指定
本番環境の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