composerでインストールしたdevツールの実行方法について
例えばPHPUnitの場合。
https://phpunit.de/
$ composer require --dev 'phpunit/phpunit'
こんな風にインストールしたとしたら、phpunitコマンドは通常vendor/bin/phpunit
に生える。
当然、そこにPATHは通ってないのが普通なのでphpunit
と言う風にコマンド実行できない。
vendor/bin/phpunit
まあ、こうすれば実行できる。
$ vendor/bin/phpunit
しかしコマンドが長くなるし、イマイチ格好良くない。
そもそも、vendor/bin
はcomposerの設定によって変更可能であり、ハードコードするのも行儀が悪い。
$(composer config bin-dir)/phpunit
vendor/binのハードコードをなくすとしたら、こう書ける。しかし大変ダサい…。vendor/binよりもタイプ数増えてるし。
$ $(composer config bin-dir)/phpunit
composer-scriptsで生やす
composer.jsonにscriptsという項目を追加すると、composerに任意のコマンドを生やすことができる。
例えばこんなふうに書いておくと、
{
// ...
"scripts": {
"test": "phpunit"
}
}
$ composer test
でvendor/bin/phpunitが実行されるようになる。
vendor/bin/を書いていないことに注目。PATHの先頭にvendor/bin/を追加してくれるので、意識しなくてもいいようになってる。npmにも似たような機能あるよね。
短く書けるし、何回も実行する場合はコマンドを生やしておくといいと思う。
なお、この状態でphpunit自体にオプションを渡したい場合は--
を挟む必要がある。
$ composer test -- --colors=always
まあ面倒くさいので、いつも指定するオプションならばcomposer.json側に書き込んでしまったほうが良い。
composer exec コマンドを使う
RubyのBundlerに似たような機能があるが、composerにもexecコマンドが追加された(2016年2月頃)。古いcomposerを使ってる人はself-updateしてみよう。
これを経由すると、割とスッキリ書ける。
$ composer exec phpunit
何回も実行するのであればscriptsで生やしてもいいと思うけど、execの方がお手軽ではある。
ちなみに、今試した感じだと「--」によるオプション渡しがうまく動作していないようだった。。今はまだscriptsの方が安定してるかなあ。。