composer require --dev barryvdh/laravel-ide-helperでerror
laravel ide-helperを入れようとしたときに詰まったのでメモ
環境
- Vagrant (OS vento/ubuntu-20.04)
- Docker
- PHP 8
- Composer 2.1.3
事象
Ide-helperインストールしようとすると以下のようなエラー発生
$ composer require --dev barryvdh/laravel-ide-helper
[errorexception] include(/var/www/src/vendor/composer/package-vers ions-deprecated/src/packageversions/installer.php ): failed to open stream: no such file or directory
調査
エラーメッセージで検索すると以下の記事がヒット
引用元のgithub issueを確認すると事象の原因が以下のように書いてある。
@bilogic I don't have proof, nor an idea how to go about proofing this, but I highly >suspect a syncing issue with
vboxfs
composer
callsunzip
unzip
unzips files and reports back it's it done -vboxfs
however is still syncing files to the host OS, so files aren't really there (yet)composer
wants to touch a file that was unzipped but can't find it (since it didn't fully sync yet)When I use the hack I described above with
sleep 0.1
after eachunzip
everything works fine, all the time. Leading me to believe this is indeed a timing issue.
And yes, there are multiple issues on VirtualBox and vagrant, but nobody thinks it's their problem and won't fix it 🤷
Googleさんの力を借りて訳すと
1.
composer
はunzip
を呼び出す
2.unzip
はファイルを解凍し、完了報告する。ただし、vboxfs
はまだファイルをホストOSに同期している状態のため、ファイルは実際には存在しない。
3.composer
は、解凍されたファイルにアクセスしようとするが、それらはまだホストOSに完全に同期されていないためno such file or directoryのエラーとなる。
つまり、ホストOSとゲストOSのファイル同期とライブラリファイルの解凍のタイミングにラグが生じていると考えられる。
※間違いあったら訂正お願いいたします。
回避策
unzipの実行完了のタイミングを遅らせてあげればよい。
1 unzipという名前のshell scriptをcomposer.jsonファイルが存在するディレクトリに配置する
#!/bin/sh
/usr/bin/unzip "$@"
sleep 0.2 # HDDストレージを使っている場合は0.9くらいに設定する
2 Vagrant上のDockerコンテナに入る
vagrant ssh
# in Vagrant instance
docker-compose exec [PJのphpコンテナ名] bash
3 作成したスクリプトをusr/local/bin
に移動
sudo cp /path/to/unzip /usr/local/bin
4 実行権限を付与
sudo chmod +x /usr/local/bin/unzip
5 composer require実行
composer require --dev barryvdh/laravel-ide-helper
6 phpコンテナ内で動作確認
php artisan ide-helper:generate
補足
間違い等ありましたらご指摘お願いいたしますm
Discussion