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

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 あたりがこのあたりをうまくやってくれているみたいです。シンプルに解決できてありがたい。