Composerを使ってみた

PHP版のBundlerみたいなもの。
最近この類の異常に目にするようになりました。
AWSの入門記事でも書きましたが、Composerに関する部分だけ抜粋してまとめます。
なので重複する文面が多いです。

Composerのインストール

curl -sS http://getcomposer.org/installer | php
#!/usr/bin/env php
All settings correct for using Composer
Downloading...
Composer successfully installed to: /var/www/aws/s3/composer.phar
Use it: php composer.phar

ここで composer.phar がカレントに作成されます。

composer.json の作成

jsonファイルを作成します。Gemfileみたいなものです。

{
"require": {
"aws/aws-sdk-php": "*"
}
}

Composerで依存パッケージのインストール

ここで composer.json に記述された依存パッケージがインストールされる。
カレントディレクトリの vendor ディレクトリにインストールされます。 .gitignorecomposer.phar とか vendor/ は外したほうがいいかもしれませんね。

$ php composer.phar install
Loading composer repositories with package information
Installing dependencies (including require-dev)
- Installing symfony/event-dispatcher (v2.4.0)
Loading from cache
- Installing guzzle/guzzle (v3.7.4)
Loading from cache
- Installing aws/aws-sdk-php (2.4.11)
Loading from cache
symfony/event-dispatcher suggests installing symfony/dependency-injection ()
symfony/event-dispatcher suggests installing symfony/http-kernel ()
aws/aws-sdk-php suggests installing doctrine/cache (Adds support for caching of credentials and responses)
aws/aws-sdk-php suggests installing ext-apc (Allows service description opcode caching, request and response caching, and credentials caching)
aws/aws-sdk-php suggests installing monolog/monolog (Adds support for logging HTTP requests and responses)
aws/aws-sdk-php suggests installing symfony/yaml (Eases the ability to write manifests for creating jobs in AWS Import/Export)
Writing lock file
Generating autoload files

不足しているシステムパッケージがあったらyumとapt-getを使ってインストールします。

さらにパッケージ追加

今度はlog4phpを使いたくなったとしましょう。
composer.json は以下のようになります。

{
"require": {
"aws/aws-sdk-php": "*",
"apache/log4php": "2.3.0"
}
}

bundle installみたいな感覚でやってみましたが

$ php composer.phar install
Installing dependencies (including require-dev) from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.
Nothing to install or update
Generating autoload files

lockファイルと一致しないと怒られてしまいました。
こういうときはupdateしないといけないみたいです。
ただ、

php composer.phar update

とするとバージョンがロックされたものについてまでアップデートがかかってしまうので、今回はlog4phpに関係するものだけインストールしてほしいので以下の様な感じにします。

php composer.phar update apache/log4php
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing apache/log4php (2.3.0)
Cloning 8c6df2481cd68d0d211d38f700406c5f0a9de0c2
Writing lock file
Generating autoload files

実際にアプリで使ってみる

ここでは追加でインストールしたlog4phpを使っています。
AWS SDKは使っていません。ゴメンなさい。
カレントディレクトリに vendor ディレクトリがあることを確認してください。

<?php
// composer.json に記述されたパッケージがインストールされた
// Vendorディレクトリの中身をロードするおまじない
require 'vendor/autoload.php';
$log = Logger::getLogger("hogehoge");
$log->info("Hello, World!");

実行してみます。
今回はコマンドラインです。

$ php hello_composer.php
INFO - Hello, World!

参考サイト

  1. gist:7838085
  2. Composer: how can I install another dependency without updating old ones? – Stack Overflow
  3. PHP – composer の「Warning: The lock file is not up to date ~」 – Qiita [キータ]
  4. Composer