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

 2012/06/02
このエントリーをはてなブックマークに追加

みなさんこんにちは。@ryuzeeです。

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
このエントリーをはてなブックマークに追加