Edited at

Composer の "scripts" 単位で Timeout の無効化が設定できるようになって便利

2019年8月3日に、Composer1.9がリリースされていて、その中で Composer\Config::disableProcessTimeout ヘルパが便利そうであった。


Composer のコマンドの実行タイムアウトは通常 300秒

Composer では、通常コマンドのタイムアウトが300秒に設定されている。

このため、scripts に、開発用サーバ起動コマンドなどを設定しようものなら、5分で強制終了されてしまう。

scripts によるスクリプトの定義は、以下などを参照されたし


composer.json

{

"scripts": {
"server": "php -S localhost:8080 -t public/"
}
}

$ composer server

> php -S localhost:8080 -t public/

-> 5分後、サーバが勝手に止まります。悲しい。


タイムアウト無効化・変更する技 (1.8以前)

以下の設定を0秒にすることで、無効化できます。下に行くほど優先度が高い (設定が上書きされる) です。


  • composer 設定の、process-timeout を設定する。



    • composer config process-timeout 0 にとすることで、composer.json にタイムアウトが無効化される設定が書き出される。ただし、当該プロジェクト全体で適用されてしまうので、都合が悪い場合があるし、ドキュメント等でその方法を示す必要がある。




  • COMPOSER_PROCESS_TIMEOUT 環境変数を設定する。



    • COMPOSER_PROCESS_TIMEOUT=0 composer server で起動することで、当該コマンドに限りタイムアウト設定を無効化できる。ドキュメント等でその方法を示す必要がある。




  • run-script--timeout オプションを設定する。



    • composer run-script --timeout 0 server で起動することで、当該コマンドに限りタイムアウト設定を無効化することができる。ドキュメント等でその方法を示す必要がある。



と、すべてドキュメント等に記載しないとワークしない方法の数々です。スクリプトの共有を楽にするはずが、これではよくありません。


Composer\Config::disableProcessTimeout ヘルパによる無効化

そこで、登場したヘルパはスクリプトとして記載することで、そのスクリプトに限りタイムアウト設定を無効化することができるスグレモノです。

このヘルパは、上記の設定等中で最優先されます。


composer.json

{

"scripts": {
"server": [
"Composer\\Config::disableProcessTimeout",
"php -S localhost:8080 -t public/"
]
}
}

$ composer server

> Composer\Config::disableProcessTimeout
> php -S localhost:8080 -t public/

→ タイムアウトしなーい。

もちろん、Composer1.8以前だと以下のようなエラーが出るので、このエラーが出る場合は compser self-update を忘れずに。 (1敗)

Method Composer\Config::disableProcessTimeout is not callable, can not call server script


参考資料