Edited at

composer で Could not delete エラーで先に進めなくなった場合の対処法

More than 3 years have passed since last update.


概要

composer installCould 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 さんの指摘で修正)