読者です 読者をやめる 読者になる 読者になる

Composer を使ってみる

Laravel を使って開発を行うにあたり、Composer の使用は避けては通れなかったのでどんなものか調べてみました。

Composerってなに?

なんのために使うの?

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

Composer はこのような問題を解決します。
どういうことかというと、プロジェクトが必要としている依存ライブラリを芋づる式にインストールしてくれます。

PEAR との違い

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

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

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

基本的な使い方

依存ライブラリの定義は composer.json に書く

プロジェクトに必要なライブラリは何かを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 に記載されている定義のみで依存管理を行うことに注意が必要です。
では、どうやって composer.lock が存在する状態で新しいライブラリのダウンロードや既存ライブラリのバージョンアップなどを行うのかというと、以下のコマンドです。

composer update

このコマンドによって、composer.json をもとに composer.lock が書き換わります。
composer.lock をコミット対象に含めなかった場合、バージョン管理システムからプロジェクトをダウンロードした人が行う依存ライブラリのバージョンは統一できなくなる可能性があります。
どういうことかというと、バージョン管理システムからプロジェクトをダウンロードした人はまず composer install を行うので、その際に composer.lock が存在していないと install コマンドを実行した時の新しいバージョンのライブラリをダウンロードしてしまう可能性があるということです。
ということで、composer.lock はコミット対象に含めましょう。

おわり

このような composer.lock の仕様の理解不足が原因で一度ハマったことがありました。
ドキュメントは読みましょうということですね。