composerではじめる新しいPHP

PHPのパッケージ管理

PHPライブラリ(パッケージ)の管理と言えば、昔はPEARでしたって人も多いのかと思います。昔はそれなりに便利なパッケージ管理ツールではあったと思うところもあります。

PEARもそれなりに素晴らしいライブラリだとは思います。ですが、管理が非常に面倒だったり、実行環境を用意する際にどのようなPEARのパッケージを入れて良いか、わかりにくい部分があります。

他言語との比較

では、他の言語ではどうでしょうか?

Rubyの場合、Bundlerという選択肢がありますよね。
NodeJSの場合はnpmがあります。Pythonだとpipとか使うんですかね?僕はPythonは苦手なので詳しくはありませんが。

比べると、PHPは良くも悪くも、他のパッケージの管理が進化しないで停滞していた時期が長い言語です。PHPでパッケージ管理が進化せずに停滞していたのには、いくつか背景があるかと思います。中でも、僕の独断と偏見で考えた理由は以下の通りです。

そもそもパッケージ管理を必要とするシステムがすくない

これは色々な政治的な理由もあると思いますが、パッケージを使い回すという概念のエンジニアがすくない(フルスクラッチで作りたがる、みたいな…)ことがその要因かなと思います。

フルスタックなフレームワークが根強い人気

PHPの中で大人気なフレームワークとしてCakePHPがあるわけですが、やつらは外部のライブラリに依存しないで自前で用意するって思想のもと開発されたのでそもそもパッケージ管理なんてものはいらない。

CakePHPにも一応pluginがありますが、自社内での使い回しとか、グローバルに使い回すってのはあまりないと思います。(DebugKitとかの話は一旦わすれてください。)

パッケージ管理のススメ

Bundlerにしろnpmにしろ、パッケージの管理としてなにが素晴らしいかというと「DSLでどのパッケージをアプリケーションが利用しているか一発でわかる」ところだと個人的には考えてます。

時代の流行でもありますし、様々な環境でアプリケーションを動かす際に、必ず同じ動作させるために必須なんですよね。Chefにしろ、Vagrantにしろどの環境でも同じように動作させるってことは昨今のアプリケーション開発には重要なので、わかりやすくDSLで定義するべきだということです。

Composerが誕生する前のPHPにはそういった物がなくて、アプリケーションがどんなPEARのパッケージが利用されているかわからなくて苦しむわけですね。

Composerの登場

このような、PEARが抱えていた問題点を解決したのがComposerです。Composerについては、パッケージを管理するためのツールって認識で大丈夫だと思います。

ComposerはどのようにDSLで管理しるのかというと、npmとかと一緒でjsonで定義しています。ComposerのDSLはこんな感じです。

{
"name": "polidog/php-chatwork-api",
"description": "Chatwork api class",
"keywords": ["chatwork","api"],
"homepage": "https://github.com/polidog/php-chatwork-api",
"license" : "MIT",
"authors": [
{
"name": "polidog",
"email": "polidogs@gmail.com",
"homepage": "http://www.polidog.jp"
}
],
"require": {
"kriswallsmith/buzz": "v0.10"
},
"require-dev": {
"phpunit/phpunit": "3.7.*",
"satooshi/php-coveralls": "dev-master"
},
"autoload": {
"psr-0": {"Chatwork\\": "lib/"}
}
}

Composerを使う理由

git submoduleで十分なのでは?って人もいるかと思います。たしかにgit submoduleで十分な場合もあるでしょう。

しかし、バージョンも含めた管理がしたい・tar.gzで公開されてるGoogleのAPI用のライブラリや、PEARのライブラリの管理はどうしたらよいのでしょうか?こういった、そもそもgitのpublic repositoryとして公開されていないモジュールを管理しようとすると、どうしてもsubmoduleでの管理には不可能になります。

Composerを使うと、そのようにtar.gzで公開されているライブラリも含め、外部のライブラリについても管理できるのがComposerの便利な点の1つです。git依存が無いというのも素晴らしいですね。

Composerの使い方

Composerを使うのは非常に簡単です。
簡単にですが、インストール方法を記載していきます。

1. Composer.pharを手に入れましょう。

$ curl -sS https://getcomposer.org/installer | php

もしくは、グローバルな環境や指定したディレクトリにインストールしたい場合は「 — install-dir」の指定をしましょう。

curl -sS https://getcomposer.org/installer | php -- --install-dir=bin

たったこれだけでcomposer自体の導入完了です。

2. composer.jsonを用意します。
たとえばChatWorkのライブラリをインストールする場合はインストールしたいディレクトリにcomposer.jsonを用意します。

{
"require":{
"polidog/php-chatwork-api": "dev-master"
}
}

3. インストールを行う
composer.jsonができたらあとはinstallコマンドを実行するだけです。

$ composer.phar install

インストールが無事に完了するとvenderディレクトリとcomposer.lockファイルが生成されているかと思います。

$ ls -alh
drwxr-xr-x 5 volare volare 170B 1 26 23:45 .
drwxr-xr-x 39 volare volare 1.3K 1 26 23:37 ..
-rw-r--r-- 1 volare volare 66B 1 26 23:44 composer.json
-rw-r--r-- 1 volare volare 3.6K 1 26 23:45 composer.lock
drwxr-xr-x 6 volare volare 204B 1 26 23:45 vendor

たったこれだけでライブラリの導入が完了できます。

Composerでインストールしたライブラリの利用方法

インストールが完了したところで、次にインストールしたライブラリの使い方を説明したいと思います。
Composerのライブラリはオートローダー対応しているので利用する場合はオートローダーのファイルをrequireするだけで簡単にライブラリが利用できます。

require './vendor/autoload.php';
$client = new \Chatwork\Client();
$client->authenticate('APIキー');
var_dump($client->api('me')->show());

このような感じでComposerを使用すれば簡単に様々なライブラリを利用できます。
Symfony2はComposer対応しています。そしてCakePHP3ではComposer対応することになっています。
Composerを使えばフレームワーク間を超えたライブラリを使う事も可能なので、まだ使った事が無いという方はぜひ使ってみましょう。