Composer 再入門

2021/03/18 12:00:00

もはやPHPで開発を行う際に、使用していないプロジェクトは探すのが大変なぐらいスタンダードな存在となった Composer ですが、 昨年めでたく 2.0 になったということで、改めて少しまとめてみます。今更とか言っちゃダメです。

Composer とは?

composer_thumb.png

Composer は、PHPの依存関係管理のためのツールです。 世界中のエンジニアが作成してくれたライブラリ(パッケージ)を、あなたのPHPアプリケーションに追加することで、あなたのPHPアプリケーションの開発を容易にしてくれます。

JavaScript でいうところの Node.js の npm のようなものです。 実際、Composer は Node.js の npm と ruby のバンドラーに強く影響を受けているそうです。

大抵のパッケージは、別の特定のパッケージの特定のバージョンに依存しているのですが、 Composer はそれらパッケージの依存関係を考慮して、パッケージのインストールやアンインストールを行ってくれます。

Composer のインストール

Composer の実体は composer.phar という、PHPのアーカイブファイル1つだけです。 つまり、PHPと、この composer.phar というファイルさえあれば動かすことができます。 プロジェクトごとにバージョンが違うと困るというような場合は、グローバルにインストールせず、プロジェクトごとのディレクトリにインストールして使いましょう。

公式サイトのダウンロードページには様々な Composer のインストール方法が記載されています。 Windows インストーラーを使ったものだったり、コマンドラインから composer-setup.php を使ったものだったり、難しそうで混乱してしまいますね。 しかし、心配はいりません。はっきり言って、手動でダウンロードする方法が一番簡単です。 なぜなら、Composer の実体は composer.phar という、PHPのアーカイブファイル1つだけなのですから。

手動でダウンロードする

公式サイトのダウンロードページの「Manual Download」> 「Latest Stable」 のリンクをクリックし、composer.phar ファイルをダウンロードします。以上!終わり!簡単ですね!

manual_download.png

実行する

実行する際は、そのダウンロードした composer.phar を PHP から呼ぶだけです。
php composer.phar --version

composer.json と composer.lock

Composer のインストールが終わったのでさっそく使いたいところですが、composer.json と composer.lock ファイルについて触れなければなりません。

composer.json

composer.json は インストールするパッケージの一覧や、Composer の設定などが記載されたファイルです。 Composer でパッケージを管理するには、このファイルが必要になってきますので、まずはこのファイルを作りましょう。

このファイルは インストールするパッケージの一覧や、Composer の設定などが記載されたファイルです。 大抵のパッケージは別のパッケージに依存していますが、その全てのパッケージを手で記載していく必要はありません。 それらの依存パッケージは Composer が自動でインストールしてくれるので、このファイルには本当に必要なパッケージのみを記載します。

このファイルは、手動または init コマンドで作成する必要があります。

php composer.phar init

require と require-dev

パッケージには、開発環境のみに必要で、本番環境などでは不要なものがあったりします。 そこで composer.json にそれぞれ別々に記載することができます。 常に必要なパッケージは require 、開発時に必要なパッケージは require-dev に記載します。

{
	"name": "hoge/hoge",
	"require": {
		"monolog/monolog": "^2.2"
	},
	"require-dev": {
		"phpunit/phpunit": "^9.5"
	}
}

composer.lock

composer.lock は composer.json ととても良く似たファイルですが、 実際にインストールされる(された)全てのパッケージの正確なバージョンの一覧が記載されているという点が異なります。 このファイルは Composer によって自動生成されるので手動で作成する必要はありません(というかきっとできません)。

パッケージはインストールされるタイミングによって、インストールされるバージョンが異なる場合があります。 複数人で開発をしている場合など、全員が同じパッケージの同じバージョンを1つ1つインストールして環境をそろえるのは大変です。

例えば、Aさんがインストールした後に、パッケージがバージョンアップされ、その後にBさんがインストールしたというような場合は、 AさんとBさんの使っているパッケージは微妙に異なってしまいます。 そこで、Aさんがインストールした時点の全てのパッケージの一覧を使ってBさんがインストールすると、AさんとBさんは完全に同じ環境が作成できます。

これを行ってくれるのが composer.lock ファイルです。 composer.lock は、環境を固定化(lock)させるためのファイルです。

パッケージの基本操作

Composer を動かすための準備は終わったので基本操作に行きましょう。

パッケージの追加

パッケージを追加するには composer.json に手動で記載しても良いのですが、 require コマンドを使用すると、composer.json への追記とパッケージのインストールを同時に行ってくれます。 なので、基本的にコマンドを使用しましょう。

オプション無しで実行すると、そのパッケージは composer.json の require に追加されます。 --dev オプションを付けて実行すると、そのパッケージは composer.json の require-dev に追加されます。

# require にパッケージを追加
php composer.phar require <package_name>
# require-dev にパッケージを追加
php composer.phar require --dev <package_name>

パッケージの削除

パッケージを削除するには remove コマンドを使用します。 オプション無しで実行すると、composer.json の require のパッケージが削除されます。 --dev オプションを付けて実行すると、composer.json の require-dev のパッケージが削除されます。

# require のパッケージを削除
php composer.phar remove <package_name>
# require-dev のパッケージを削除
php composer.phar remove --dev <package_name>

パッケージをまとめてインストールする

composer.json に記載されているパッケージをまとめてインストールするには、install コマンドを使用します。 オプション無しで実行すると、composer.json の require と require-dev に記載されているパッケージがインストールされます。 --no-dev オプションを付けて実行すると、require に記載されているパッケージのみインストールされ、 require-dev に記載されているパッケージはインストールされません。 本番環境などで、require-dev に記載されているパッケージは不要な場合は、--no-dev オプションを付けて実行します。

composer.lock ファイルがない状態で、install コマンドを実行すると、 composer.json に記載されている全てのパッケージが vendor ディレクトリにインストールされ、 そのパッケージの正確なバージョンが composer.lock ファイルに書き込まれます。

composer.lock ファイルがある状態で、install コマンドを実行すると、 composer.lock に記載されている正確なバージョンを使用してインストールされます。

# require と require-dev に記載されているパッケージをインストール
php composer.phar install
# require に記載されているパッケージのみインストール
php composer.phar install --no-dev

パッケージをまとめて最新化する

パッケージを最新バージョンに更新するには、update コマンドを使用します。 update コマンドを実行すると、composer.json に記載されているパッケージが最新化され、composer.lock が新しいバージョンで更新されます。 これは、composer.lock ファイルを削除して install コマンドを再度実行するのと同じです。

php composer.phar update

もし、個別のパッケージのみを最新化したい場合は、その更新したいパッケージの一覧を uptate コマンドに指定します。

php composer.phar update <package_name> [...]

オートローディング

Composer でパッケージをインストールする方法はわかりました。 では、そのインストールされたパッケージのクラスを、実際にPHPで使うにはどうすればいいでしょうか?

Composer はパッケージのインストールを行った際、vendor/autoload.php というファイルを生成します。 このファイルは、Composer でインストールされたパッケージのファイルを自動で読み込むためのPHPのプログラム(オートローダー)が記載されています。 そのため、このファイルを読み込むだけで、インストールしたパッケージの全てのクラスを使用することができるようになります。

<?php
// 必要なのはこの1行のみ
require __DIR__ . '/vendor/autoload.php';

// Composer でインストールした全てのパッケージのクラスが使用できます
$log = new Monolog\Logger('name');
$log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING));
$log->addWarning('Foo');

独自のコードをオートロードする

Composer のオートローダーでは、Composer でインストールしたパッケージの他に、あなたが独自に利用しているライブラリなども自動で読み込むことができます。 この機能を利用すると、読み込み処理を別途記述する必要がなくなるのでとても便利です。 composer.json に autoload という項目を追加すると利用できるようになります。

autoload の項目には、名前空間からディレクトリへのマッピングを記述します。 オートローディングには PSR-0PSR-4 が使用できますが、PSR-0 は非推奨ですので、PSR-4 を使用しましょう。 下記の例でいえば、PSR-4 の規約に従って Foo という名前空間のクラスが、library/Foo/ のディレクトリからオートローディングされます。 ちなみにPSRというのは、PHPの標準コーディング規約です。

autoload の項目は、require の項目と同様、開発環境のみに必要で、本番環境などでは不要なものがあったりします。 例えば、単体テストだけで使うコードなどです。 そこで composer.json にそれぞれ別々に記載することができます。 常に必要なオートロードは autoload 、開発時にのみ必要なオートロードは autoload-dev に記載します。

{
	"name": "hoge/hoge",
	"require": {
		"monolog/monolog": "1.0.*",
		"guzzlehttp/guzzle": "7.0"
	},
	"autoload": {
		"psr-4": {
			"Foo\\": "library/Foo/"
		}
	},
	"autoload-dev": {
		"psr-4": {
			"Bar\\": "library/Bar/"
		}
	}
}

autoload の項目を変更した際には、vendor/autoload.php を再生成する必要があります。 再生成するには、dump-autoload コマンドを使用します。

php composer.phar dump-autoload

Packagist

ここまでで、パッケージの基本的な操作方法や、PHPからの利用方法はわかったかと思います。 しかし重要な点に触れていませんでした。

そもそもどんなパッケージが利用できるのでしょうか?

Packagist とは Composer のパッケージの管理を行っているメインのサイト(リポジトリ)です。 Composer のパッケージは、この Packagist からダウンロードされて、インストールされています。 一応、他の場所に登録されたパッケージも Composer でインストールすることはできますが、 基本的にはこのサイトに登録されたパッケージを使うことになるかと思います。

どんなパッケージがあるのか検索したり、またはご自身でパッケージを作って世界に公開したい場合、Packagist を利用しましょう。

packagist.png

Composer 自身の更新

最後に、Composer 自身(つまり、composer.phar)の更新方法も記載しておきます。 self-update コマンドを使用すると、composer.phar を最新化することができます。

# 現在の composer.phar のバージョンを確認する
php composer.phar --version
# composer.phar を最新化する
php composer.phar self-update

参考サイト

関連記事

前回、「Composer 再入門」の続きです。今回はスクリプトについてです。スクリプトとは?composer.json にスクリプトを定義しておくと、Composer からそのスクリプトを実行できます。特定の定型処理などをまとめておきたいという場合に、登録しておくと便利です。スクリプトを登録するcomposer.json ファイルの "scripts" 項目 ...
前回、「Composer 再入門(その2:スクリプト)」の続きです。今回はオートローダーの最適化についてです。オートローダーの最適化デフォルトでは、Composer のオートローダーはクラスの名前を解決する際に、ファイルシステムのチェックを行っています。新しくファイルが追加されたり削除されたりしても、オートローダーがそのファイルをすぐに検出して使用できるよう ...
前回、「Composer 再入門(その3:オートローダーの最適化)」の続きです。今回は便利コマンドについてです。list コマンドComposer で使用できるコマンドの一覧を表示できます。どんなコマンドがあるのか、このコマンドで調べましょう。php composer.phar listhelp コマンドhelp コマンドを使用すると、Composer のコ ...
最近のアプリケーションは開発効率を上げるために大量のライブラリを組み合わせて作成することが多くなっています。そういった状況下では、たった1つのライブラリがバージョンアップすることで、そのライブラリに依存している他のライブラリが正常に動作しなくなり、やがてアプリケーション全体が正常に動作しなくなるというような状況に陥ります。あるライブラリが別のライブラリに依存 ...

記事検索

アーカイブ

2021

2019

2018

2017

2016

2015

2014

2013

2012

2011

2010

RSSフィード