Composer を使ってみる

Laravel で開発するあたり、Composer の使用は避けては通れなそうだったのでどんなものか調べてみたときのメモ。

Composerとは

なんのために

あるソフトウェアを動作させるためには、そのソフトウェアが依存しているライブラリを用意する必要があります。
また、その依存しているライブラリが依存しているライブラリも用意する必要があります。
またまた、その依存しているライブラリが依存しているライブラリが依存している....(以下略
これを全て手動で揃えていては大変です。

Composer はこのような問題を解決するための所謂パッケージ管理システムで、プロジェクトが必要としている依存ライブラリを芋づる式にインストールしてくれます。

PEAR との違い

他の有名な PHP の依存管理ツールに PEAR がありますが、以下のような違いがあります。

  • PEAR では基本的には OS にライブラリをインストール
    • Composer はプロジェクト単位での管理が基本。プロジェクトごとに同じライブラリの違うバージョンを使用可能
  • PEAR ではパッケージ導入の際にroot権限が必要
    • Comopser では一般ユーザでもパッケージの導入が可能

また、Composer にはオートローディング規則によって依存するライブラリをオートロードしてくれる機能が備わっています。
これによって、require を宣言する必要がなくなります。

基本的な使い方

依存ライブラリの定義

プロジェクトに必要なライブラリをJSON形式で composer.json に定義します。
依存ライブラリの定義を行った後に、

composer install

コマンドを実行することによって、composer.json に定義された内容をもとに /vendor ディレクトリ以下に依存ライブラリがダウンロードされます(上記コマンドは Composer をグローバルにインストールした場合)。

composer.lock はバージョン管理システムの管理下へ

composer.lock ファイルが存在しない状態で composer install コマンドを実行すると、composer.lock ファイルが自動作成されます。
composer.lock には、install コマンドによって実際にダウンロードしたライブラリ名とそのバージョンのリストが書かれています。
また、composer.lock が存在している状態で install コマンドを実行すると、composer.json は見ずに、composer.lock に記載されている情報のみで依存解決(ライブラリをダウンロード)することに注意が必要です。つまり、lock ファイルはキャッシュのような形で働きます。
では、どうやって lock ファイルが存在する状態で新しいライブラリのダウンロードや既存ライブラリのバージョンアップなどを行うのかというと、以下のコマンドの実行です。

composer update

このコマンドは composer.json をもとに composer.lock を書き換えます。
なので、composer.lock をコミット対象に含めなかった場合、他の共同開発者とライブラリのバージョンを統一できなくなります。 プロジェクトをダウンロードした開発者はまず composer install をしますが、その際に composer.lock が存在しないと、install コマンドを実行したタイミングで最新のバージョンのライブラリをダウンロードしてしまい、他の開発者とバージョンズレが生まれる可能性があるということです。
ということで、composer.lock はコミットに含めましょう。