Composer使ってみる (オートローダー, PHPUnit含む)
自分用のライブラリをComposerパッケージ化するために勉強中
構成
ここでは以下のようにします
- ベンダー名・パッケージ名は
napoporitataso/myapp
とする。 - ソースコードの名前空間は
Napoporitataso\MyApp
とする。 - 本体のソースコードは
src/
以下に置く。 - テストプログラムは
tests/
以下に置く。 - オートローダーを使う。
- テストプログラムはPHPUnitを使う (日本語マニュアル)。
セットアップ
composer.json 作成
まずプロジェクト置き場で composer init
します。
いろいろ聞かれるので、答えると composer.json
が作成されます。詳細は以下のComposer公式マニュアルを読みます。
The composer.json Schema - Composer
Minimum Stability
...composer require
とかで他のパッケージをインストールする時の挙動。dev
を設定すると、何でもインストールできる。stable
を設定すると、安定版だけインストールできる。デフォルト値はstable
。Package Type
... このパッケージを他の人がインストールする時の挙動。library
を設定すると、単純にvendor
フォルダ以下にコピーされる。普通はこれでよいので他の説明は割愛。デフォルト値もlibrary
。
ここでは以下のような composer.json
になりました。(追加のパッケージは指定しませんでした。)
PHPUnitインストール
次に、以下コマンドでPHPUnitをインストールします。
すると vendor
フォルダが作成され、PHPUnitとその依存ライブラリがインストールされます。また、composer.json
に require-dev
が追記されます。
また、この時点でオートローダーも自動で作成されており、vendor/autoload.php
および vendor/composer/
以下がそうです。プログラム内で verdor/autoload.php
を require
(include
) すれば、PHPUnitほかインストール済みライブラリをオートロードできます。
オートローダー設定追加
最後に、自分のソースコードもオートロードできるように、オートローダーに設定を追加します。
composer.json
に以下を手動で追記します。
そしたら以下コマンドを実行し、verdor/
以下に作成されているオートローダーを更新します。
これでプログラム内で verdor/autoload.php
を require
(include
) すれば、インストール済みライブラリだけでなく、Napoporitataso\MyApp
以下もオートロードできるようになりました。
なお、psr-4
というのはPHPのオートロードの仕様名だそうです。ここらへんは以下の記事が参考になりました。
【PHP】PSR-4 Autoloader(オートローダー)
Composerのautoloadの書き方早見表 - Qiita
.gitignore作成
うっかり vendor/
以下をコミットしてしまわないように、.gitignore
も作成します。
以上でセットアップは終わりです。この時点で composer.json
は以下の通りになっています。
段階を踏まなくても、最初からこのファイルを置いて composer install
するだけで同じ環境を作ることは可能です。その場合、composer update
してPHPUnitを最新版に更新した方がいいかも。
本体プログラム作成
src/
以下に本体のプログラムを作っていきます。ここでは以下のように用意します。ひよこ (Chick) が虫 (Worm) を食べられそうなだけのプログラムです。
テストプログラム作成
tests/
以下にテストプログラムを作っていきます。ここでは以下のように用意します。
ここまでで構成は以下のようになっています。
テスト実行
以下コマンドでテストプログラムを起動します。対象をフォルダで指定してるので、フォルダ内の *Test.php
* ファイルを、PHPUnitが全て実行してくれます。
ところで、ここまでオートローダーを読み込むコードを一切書いてないのですが、どうも phpunit
コマンドを実行した際、PHPUnit自身が自分でオートローダーを require
してるようです。なのでPHPUnitからプログラムを実行する限りなら、テストプログラム内でオートローダーを require
しなくてもちゃんと動くみたいです。
(少しググった感じだと bootstrap
でオートローダーを読み込んでるコードが多かったのですが、古いバージョンではそうする必要があったのか?)
実行すると、以下のように問題なく終了しました。
以上
以上、とりあえずComposer使ってみた感じです。探してたら以下のようなものもあるみたいなので、もうちょい色々見てみます。