対象読者
この記事は主にcomposer
のパッケージを開発しているパッケージメンテナーのための記事です。
低いバージョンの依存テストの必要性
composerで作成したパッケージを他のパッケージから利用する場合composer.lock
は無視されます。
this lock file will not have any effect on other projects that depend on it. It only has an effect on the main project.
通常与えられた条件の最新のバージョンがインストールされます。テストは最新の依存だけをテストすることになり。^
や~
で指定した最低のバージョンのテストは行われません。
これが問題になるのは、他のパッケージが特定のパッケージの低いバージョンのものに依存していて、また他のパッケージではその高いバージョンのみにある機能を使用している場合です。依存解決は低いバージョンで行われ、最新バージョンに依存したパッケージはエラーを引き起こしたりBugの元になったりします。
最低限のバージョンの依存のテスト
--prefer-lowest
オプションでcomposer update
するとcomposer.json
で指定した範囲で最低のバージョンがインストールされます。
composer update --prefer-lowest --prefer-stable
./vendor/bin/phpunit
Travis CIでのテスト
Travis CIでは以下の記述で複数のバージョンで最新の依存と最低バージョンの依存を取得します。
language: php
sudo: false
php:
- 5.6
- 7
- 7.1
- hhvm
env:
matrix:
- DEPENDENCIES=""
- DEPENDENCIES="--prefer-lowest --prefer-stable"
before_script:
- composer self-update
- composer update $DEPENDENCIES
まとめ
composer.lock
を使ってバージョンをロックできるのは他から依存されることのないメイン(ルート)のパッケージだけです。多くの依存のあるパッケージの依存解決がスムーズになるように、最低バージョンの依存を指定します。
一般に最新のバージョンのパッケージの利用を勧めることは良いプラクティスですが、一方で互換性や対象を多くするために動作する最低限のバージョンをなるべく広く取るようにした方がいいでしょう。
パッケージメンテナーは動作する依存パッケージの最低限のバージョンを正しく表記する必要があります。
- Composerで依存パッケージのcomposer.lockは使われるのか? http://blog.a-way-out.net/blog/2014/12/30/composer/
- Testing your composer dependencies with prefer-lowest https://evertpot.com/testing-composer-prefer-lowest/