概要
composer install
で Could not delete
というエラーで先に進めなくなった場合の対処とその原因について説明します。
問題の現象
composer install
で下記のようなエラーで中断してしまうことがあります。
[RuntimeException]
Could not delete /var/www/html/php-csv-file-iterator/vendor/phpoffice/phpexcel/.git/objects/pack/tmp_pack_Z4npdu:
その後は何度リトライしても、同じエラーが出て先に進めません。
sudo rm /var/www/html/php-csv-file-iterator/vendor/phpoffice/phpexcel/.git/objects/pack/tmp_pack_Z4npdu
をしても Text file busy
と言われて消すことも出来ません。
何が起こっているのか
前述の例でいえば、phpexcel
を clone 中に composer がタイムアウトした可能性が高いです。
タイムアウトの後の処理としてディレクトリを削除しようとしますが、
裏ではまだ git clone
が動いているのでディレクトリは消せず、エラーとなっています。
試しに、ps aux | grep git
を実行してみると composer は終了しているのにプロセスが生きていることが判ると思います。
vagrant 16169 0.3 0.1 16220 1580 pts/2 S 14:59 0:01 git clone --no-checkout git://github.com/PHPOffice/PHPExcel.git /var/www/html/php-csv-file-iterator/vendor/phpoffice/phpexcel
vagrant 16170 0.5 0.0 16220 516 pts/2 S 14:59 0:01 git clone --no-checkout git://github.com/PHPOffice/PHPExcel.git /var/www/html/php-csv-file-iterator/vendor/phpoffice/phpexcel
vagrant 16171 2.2 0.2 11552 2424 pts/2 S 14:59 0:07 git index-pack --stdin --fix-thin --keep=fetch-pack 16169 on localhost.localdomain
vagrant 16201 0.0 0.0 103240 868 pts/2 S+ 15:04 0:00 grep git
このプロセスを kill 16169
で終了させれば composer は無事にディレクトリを消せるようになります。
ですが、このまま再実行してもまたタイムアウトする可能性は高いでしょう。
composer のタイムアウト時間を伸ばす
タイムアウトのデフォルトは 300 秒 (5分) です。
vi ~/.composer/config.json
で設定ファイルを開き、下記のように "process-timeout": 1200
を書き加えます。
こうすることでタイムアウト時間は 20 分にまで延長されます。
{
"config": {
"process-timeout": 1200
}
}
一時的に回線が遅い場合など、今回だけ伸ばしたいのであれば、
export COMPOSER_PROCESS_TIMEOUT=1200
を composer install
の前に実行しても構いません。
こうして再実行
これで再度 composer install
を実行すれば大丈夫なはず。
ただし、なんらかの原因で ~/.composer/cache
が壊れてしまっていて、再実行もエラーになることがあるようです。
その場合には、 rm -rf ~/.composer/cache
composer clear-cache
を実行してから、改めて composer install
を実行すれば大丈夫です。(2016-02-16 sizuhiko さんの指摘で修正)