PHPの依存関係管理ツール Composer

Composer とは

PHPのアプリケーションやライブラリの開発で使用するライブラリの依存関係を解決するツールです。node.js の npm や ruby の bundler にインスパイアされて作成されました。 https://getcomposer.org/


何をしてくれるの?

ライブラリを使う立場の場合

  • 自分のプロジェクトが依存するライブラリのダウンロードやアップデートが出来る
  • 依存するライブラリが依存している別のライブラリのダウンロードやアップデートをしてくれる
  • 依存するライブラリのバージョンを正確に判断してくれる
  • プロジェクトが依存するライブラリを autoload してくれる(require をたくさん宣言しなくてよくなる)

アプリケーションやライブラリを公開する立場の場合

  • 自分が公開するアプリケーションやライブラリが依存するライブラリとバージョンを定義できる(他の人が Composerで利用可能にする)
  • リポジトリにアプリケーションやライブラリを公開し検索を可能にできる

この記事ではライブラリを使う立場 で Composer を使用してみます。


要求事項

PHPのバージョンが 5.3.2 以上


インストール

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

使ってみる

以下のプロジェクトを使って、Composer を試してみます。 プロジェクトのファイル構成

hello_project/
└── hello.php
<?php
// hello.php

echo "Hello Composer World!!n";

echo しているだけの簡単なプログラムです。 このプログラムにログ出力を追加しようと思います。

パッケージのインストール

hello_project ディレクトリで composer.json ファイルをテキストエディタを使って作成します。 ログ出力ライブラリ monolog を指定します。

hello_project/
├── composer.json
└── hello.php
{
  "require": {
    "monolog/monolog": "1.0.*"
  }
}

composer install を実行して monolog パッケージをインストールします。

composer install

今まで、説明の都合上「ライブラリ」と記述してきましがた、Composer では管理対象を「パッケージ」と呼びます。管理対象が必ずしもライブラリだけでは無く、アプリケーションも取り扱う為、パッケージと呼びます。以降「パッケージ」と記述します。 パッケージのダウンロードが完了すると以下の様なファイル構成になりました。

hello_project/
├── composer.json
├── composer.lock
├── hello.php
└── vendor/
    ├── autoload.php
    ├── composer/
    └── monolog/
    └── monolog/

monolog が vendor/monolog/monolog ディレクトリ以下にダウンロードされたのが分かります。 その他に、composer.lock, vendor/autoload.php ファイルと vendor/composer ディレクトリも作成されました。 Composer では基本的にパッケージをプロジェクト毎に管理するので、プロジェクトディレクトリに vendor ディレクトリを作成し、そこにパッケージを格納します。

オートロード

monolog がダウンロードできたので、hello.php で使ってみます。 hello.php を以下のように編集します。

<?php
// hello.php

require "vendor/autoload.php";

$log = new Monolog\Logger(basename(__FILE__, ".php"));
$log->pushHandler(new Monolog\Handler\StreamHandler("app.log", Monolog\Logger::DEBUG));

$log->addDebug("Program START!");
echo "Hello Composer World!!n";
$log->addDebug("Program END!");

hello.php を実行すると、app.log ファイルにログが出力できるようになりました。
※ monolog 自体の説明はここでは省略します。

php hello.php
# app.log
[2015-02-14 22:10:15] hello.DEBUG: Program START! [] []
[2015-02-14 22:10:15] hello.DEBUG: Program END! [] []

ここで、注目するのは require 文です。

require "vendor/autoload.php";

特に monolog に関して require することなく、この1文で monolog が使えてしまいました。このサンプルでは Composer でダウンロードしたパッケージが monolog だけですが、他にも多数ダウンロードした場合でも、この1文だけで、全てのパッケージを自動的にロードすることが出来ます。 composer install した後に作成された、vendor/autoload.php と vendor/composer ディレクトリ内のファイルがこのオートロードを可能にしています。


composer.json の書式

ここで少し戻って、composer.json ファイルを振り返ります。

{
  "require": {
    "monolog/monolog": "1.0.*"
  }
}

require ブロックではプロジェクトが依存する パッケージ名とバージョンを指定 します。

  • “monolog/monolog” と書かれた部分は “ベンダー名/パッケージ名” を表します。
  • “1.0.*” と書かれた部分はパッケージのバージョンを表します。

複数のパッケージを指定する場合はカンマで区切って以下のように記述します。

{
  "require": {
    "monolog/monolog": "1.0.*",
    "ベンダーA/パッケージa": "2.0.0",
    "ベンダーA/パッケージb": ">=2.0",
    "ベンダーB/パッケージ1": "2.0.0",
    "ベンダーB/パッケージ2": "~2.1"
  }
}

パッケージのバージョン指定方法

バージョンの記述方法には以下のものがあります。

記述 意味
1.0.2 特定のバージョンを指定
1.2.* 1.2.0以上でかつ1.3.0未満
1.* 1.0.0以上でかつ2.0.0未満
~1.2.3 1.2.3以上でかつ1.3.0未満
~1.2 1.2.0以上でかつ2.0.0未満

composer.lock

composer install を実行すると、Conposercomposer.json に記述されているバージョン指定の範囲で、現時点で入手可能な最新バージョンのパッケージをダウンロードします。そして、そのバージョンを composer.lock に記録します。 composer.lock ファイルは非常に重要で、プロジェクトが依存するパッケージのバージョンを固定してくれます。 再度、composer install を実行した時、Conposerconposer.lock が存在していれば、そこに記載されているバージョンのパッケージをダウンロードしようとします(もちろんダウンロード済であれば実際にはダウンロードしません)。例えその時点で composer.json のバージョン指定に合致する範囲で、もっと新しいバージョンのパッケージがリリースされていても、アップデートは行いません。 composer.lock があれば、チーム内の他のプログラマのPCへ環境をセットアップする時や、ステージング環境や商用環境へリリースする時でも、同じバージョンのパッケージを使用することが保証されます。

git を使ってバージョン管理をしている場合、composer.lock を必ずコミットする ようにしてください。 ちなみに、vendor ディレクトリは .gitignore に記載して、コミットの対象外にします。


パッケージのアップデート

意図的にパッケージをアップデートしたい時は、composer update コマンドを使用します。

composer update

Composer は composer.lock に記録されているバージョンを無視して、composer.json に指定されているバージョンの範囲で最新のバージョンにアップデートします。そして、そのバージョンを composer.lock に記録します。 特定のパッケージのみをアップデートしたい時は、composer updete にパッケージ名も指定します。

composer update ベンダー名/パッケージ名

パッケージの追加

一旦、composer install した後で、パッケージを追加するには composer require コマンドを使います。

composer require ベンダー名/パッケージ名:2.*

パッケージ名の後にセミコロンで区切ってバージョンを指定します。 Composer は 追加パッケージ名とバージョン指定を comporser.json に追記し、パッケージをダウンロードします。そして、そのバージョンを composer.lock に記録します。

ちなみに、テキストエディタで composer.json にパッケージとバージョンを追記して、 composer install を実行すると、Wraning が表示されて、インストールされません。composer update を実行すれば、追記したパッケージをインストールすることは出来るですが、既にインストールしてあるパッケージもアップデートされてしまいます。composer require を使って追加するのが正しいやり方です。


パッケージの削除

composer remove パッケージ名

パッケージの検索

Composer で require できるパッケージは Packagest で検索することができます。 Packagist – https://packagist.org/


最後に

今回は、パッケージを使う側の視点で、Composerを使って見ましたが、自身でパッケージを公開することも出来ます。ここでは紹介できなかった機能もあるので、一度は公式サイトに目を通しておくことをおすすめします。 https://getcomposer.org/ Composer の登場で、PHPのエコシステムが整ってきました。 Composer でハッピーなPHPライフを!

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中