$ composer dev
と打ったら PHP の Docker コンテナを起動して PHP を触りたい。つまり
composer
のscripts
設定で、コンテナにソースコードをマウントしてコンテナ内で開発・デバッグできる状態。
しかし、Interactive shell
と表示され終了してしまう。Docker に限らず、他の対話式のシェル・スクリプトでも同じ。
「composer ユーザーコマンド 対話式 実行 tty interactive shell」でググってもドンピシャの Qiita 記事が出てこなかったので、自分のググラビリティとして。
TL; DR
[コマンド] < /dev/tty
でtty
をコマンドとつなげる。その際、
Composer\\Config::disableProcessTimeout
も設定しないと、composer
の制限で 300 秒で接続が切れてしまう。
TS; DR
以下は3つのユーザー・コマンドを composer
に設定している例です。ポイントは 3 つ目の dev
の項目。
{
...
"scripts" :{
"test": [
"./vendor/bin/phpunit --configuration=./config/phpunit.xml"
],
"compile": [
"./vendor/bin/box compile --config=./config/box.json"
],
"dev": [
"Composer\\Config::disableProcessTimeout",
"docker run --rm --entrypoint='/bin/bash' --workdir='/app' -v $(pwd):/app php:7-cli-alpine < /dev/tty"
]
}
}
composer test
コマンドで PHPUnit を使ってユニット・テストをローカルで実行。composer compile
コマンドで Box3 を使って ./bin
ディレクトリ設置用の Phar アーカイブの作成。そして composer dev
コマンドで Docker の PHP7 コンテナを起動して対話式(bash
シェル)で触れるようにしている例です。
この時、composer dev
のメリットは、任意の PHP バージョンで Docker 上で実行できるので、Travis CI で回す前の簡易テストに便利です。
composer
のユーザー・コマンド経由でターミナルの tty
(入出力)を Docker に繋げるのがうまく行かなかったのですが、< /dev/tty
によりターミナルの tty がコンテナに繋がるようになり、SSH した時のような操作感があるので便利です。
🐒 注意点
ターミナルの種類(macOS のターミナルなど)によってコンテナからexit
するとtty
接続が壊れてターミナルを立ち上げ直さないといけない時があります。これはcomposer
が使っている依存パッケージのsymfony
のconsole
の仕様です。しかし、VSCode のターミナルからだとexit
した以降でもローカルに戻ってきます(VSCode を立ち上げ直さなくても大丈夫です)。これは VSCode 側が、戻ってきたらターミナルを初期化をするからです。
参考文献
- Writing Composer Scripts by Greg Anderson @ pantheon.io
- Interactive PHP script with composer @ StackOverflow
- 拡張/プラグイン/ユーザーコマンド/カスタム | 逆引き!Composer コマンド・ライン一覧 @ Qiita