PHPの外部ライブラリの管理にComposerを使う

 2012/06/02

ComposerはRubyでいうところのBundlerのようなもので、アプリケーションが必要とする外部ライブラリを、そのアプリケーション固有の状態で一元的に管理してくれるツールだ。

PHPではPearのようなコマンドを使ってライブラリをインストールすることが一般的ではあるが、アプリケーションによって必要とするバージョンが違う、といったケースでは問題が起こりやすい。例えば手動でインストールをしていた場合、将来的にライブラリの配布が終わってしまったり、特定のバージョンが配布されなくなると困ってしまう(なのでインストールしたバージョンは構成管理の対象とするべきで、常に環境を再現可能にしなければならない) Composerを使うことで、そのような問題からは簡単に解放される。

なお、ComposerはPHP5.3.2以降で利用可能だ。 またちょっと前まではPHPUnitのインストールが出来ないという切ない状況だったが現在は解消されている。開発速度はかなり早いので継続的にウォッチすることをオススメする。

インストール

インストールは簡単だ。まずvendorディレクトリを作成するルートディレクトリに移動する。そこで

curl -s http://getcomposer.org/installer | php

とすると、composer.pharがダウンロードされる。以降、このダウンロードファイルを利用する。

使い方

では早速ライブラリをインストールしてみよう。まず、composer.pharと同一ディレクトリに、composer.jsonという名前で以下の内容のファイルを作る。 ここでは、ログ出力のライブラリであるmonologのバージョン1.0.0以上をインストールするという設定にする。

{
    "require": {
        "monolog/monolog": ">=1.0.0"
    }
}

ファイルを作成したら以下のようにコマンドを入力する

php composer.phar install

すると、ライブラリのダウンロードが自動的に開始され、カレントディレクトリにvendorディレクトリを作成した上で、そこに配置される。

バージョン管理を行う場合は、composer.pharとcomposer.jsonに加えてインストールされているライブラリのバージョンが記載されたcomposer.lockも登録を行うこと。

例えば今回のインストールでは、以下のようなディレクトリになる。

$ tree -L 3
.
├── composer.json
├── composer.lock
├── composer.phar
└── vendor
    ├── autoload.php
    ├── composer
    │   ├── ClassLoader.php
    │   ├── autoload_classmap.php
    │   ├── autoload_namespaces.php
    │   └── installed.json
    └── monolog
        └── monolog

インストールしたライブラリの使い方

composerではautoload用のファイルを自動的に生成してくれるため、アプリケーションでcomposer経由でインストールしたライブラリを使う際は、vendor/autoload.phpをインクルードすれば良い。 いまインストールしたmonologを利用してログを出力する場合は次のソースになる。

require 'vendor/autoload.php';

$log = new Monolog\Logger('name');
$log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING));
$log->addWarning('Foo');

ちょっと複雑な例

ここまでは単純だったので、次にもうちょっと複雑なパターンを試してみよう。

composer.json

{
    "repositories": [
        {
            "type": "package",
            "package": {
                "name": "smarty/smarty",
                "version": "3.1.7",
                "dist": {
                    "url": "http://www.smarty.net/files/Smarty-3.1.7.zip",
                    "type": "zip"
                },
                "source": {
                    "url": "http://smarty-php.googlecode.com/svn/",
                    "type": "svn",
                    "reference": "tags/Smarty_3_1_7/distribution/"
                }
            }
        },
        {
            "type": "pear",
            "url": "http://pear.symfony-project.com"
        },
        {
            "type": "pear",
            "url": "http://pear.phpunit.de"
        }
    ],
    "require": {
        "smarty/smarty": "3.1.*" ,
        "monolog/monolog": "1.0.*" ,
        "php": ">=5.3.2",
        "davedevelopment/phpmig": "*",
        "pear-phpunit/PHPUnit": "*"
    },
    "config": {
        "bin-dir" : "bin/"
    }
}

この例では、以下のようなことを行なっている。

  • githubではないところにホスティングされているSmartyについてレポジトリの設定を行うことで、requireの中でダウンロード可能としている。
  • phpのバージョンとしてphp5.3.2以上であることを要求している
  • phpmigについては特にバージョンの指定なくインストールしている
  • 同様にPHPUnitをインストールしているが、PHPUnitはPEARのチャンネルが用意されており、そちらを指定している。またその中で依存関係があるものをチャンネル追加している。
  • 設定として、実行可能ファイルやスクリプトはカレントにあるbinディレクトリを作成し配置するようにしている

インストールについては先ほどと同様のコマンドでOKだ。

 2012/06/02

サイト内検索


著作

寄稿

Latest post: