PHP_CodeSniffer-1.5.x と phing-2.6.1 が喧嘩するので phing の開発版を使った話
一度テスト環境を作ったまま、そのままテストを回し続けていた PHP プロジェクトがあるのですが、
composer が
Warning: This development build of composer is over 30 days old. It is recommended to update it by running "composer.phar self-update" to get the latest version.
なんてことを言い出すので、まとめてアップデートすることにしました。
ワーニングに出ているとおり self-update を実行して、そのあと依存パッケージを更新します。
$ php composer.phar self-update $ php composer.phar update
そして phing でテストタスクを実行してみると PHP_CodeSniffer のところで次のようなエラーが出てしまいました。
PHP Fatal error: Call to undefined method PhpCodeSnifferTask_Wrapper::getFilesErrors() in /home/app/gnavi-gauth/projects/gnavi.phpclient/vendor/phing/phing/classes/phing/tasks/ext/PhpCodeSnifferTask.php on line 475 PHP Stack trace: PHP 1. {main}() /home/app/gnavi-gauth/projects/gnavi.phpclient/vendor/phing/phing/bin/phing:0 PHP 2. require_once() /home/app/gnavi-gauth/projects/gnavi.phpclient/vendor/phing/phing/bin/phing:20 PHP 3. Phing::fire() /home/app/gnavi-gauth/projects/gnavi.phpclient/vendor/phing/phing/bin/phing.php:43 PHP 4. Phing::start() /home/app/gnavi-gauth/projects/gnavi.phpclient/vendor/phing/phing/classes/phing/Phing.php:272 PHP 5. Phing->runBuild() /home/app/gnavi-gauth/projects/gnavi.phpclient/vendor/phing/phing/classes/phing/Phing.php:172 PHP 6. Project->executeTargets() /home/app/gnavi-gauth/projects/gnavi.phpclient/vendor/phing/phing/classes/phing/Phing.php:574 PHP 7. Project->executeTarget() /home/app/gnavi-gauth/projects/gnavi.phpclient/vendor/phing/phing/classes/phing/Project.php:797 PHP 8. Target->performTasks() /home/app/gnavi-gauth/projects/gnavi.phpclient/vendor/phing/phing/classes/phing/Project.php:824 PHP 9. Target->main() /home/app/gnavi-gauth/projects/gnavi.phpclient/vendor/phing/phing/classes/phing/Target.php:320 PHP 10. Task->perform() /home/app/gnavi-gauth/projects/gnavi.phpclient/vendor/phing/phing/classes/phing/Target.php:297 PHP 11. PhpCodeSnifferTask->main() /home/app/gnavi-gauth/projects/gnavi.phpclient/vendor/phing/phing/classes/phing/Task.php:260 PHP 12. PhpCodeSnifferTask->printErrorReport() /home/app/gnavi-gauth/projects/gnavi.phpclient/vendor/phing/phing/classes/phing/tasks/ext/PhpCodeSnifferTask.php:415
最新版を入れると動かなくなるというのは悲しいですね。
解決すべくぐぐってみると PHPCS 1.5.0 breaks PHPCodeSniffer Task というイシューで既に解決済みのようです。
しかし、この修正はまだリリースされていないため最新版である phing-2.6.1 を使うとコケるというわけです。
仕方がないので、composer.json のバージョンしていを * から dev-master に書き換えて回避することにしました。
{ "require-dev": { "phing/phing": "dev-master", "phpunit/phpunit": "*", "phpmd/phpmd": "*", "sebastian/phpcpd": "*", "squizlabs/php_codesniffer": "*" }, "config": { "bin-dir" : "bin/" } }
最初、dev-master という指定の仕方を知らずに自分で repositories 定義を書いてたりしたんですが、
composer か packagist あたりがこのあたりをうまくやってくれているみたいです。シンプルに解決できてありがたい。