🛠

composer require --dev barryvdh/laravel-ide-helperでerror

2021/09/19に公開

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

調査

エラーメッセージで検索すると以下の記事がヒット

https://stackoverflow.com/questions/65149298/composer-2-0-8-issue-package-versions-deprecated

引用元の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

  1. composer calls unzip
  2. 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)
  3. 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 each unzip 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.composerunzipを呼び出す
2. unzipはファイルを解凍し、完了報告する。ただし、 vboxfsはまだファイルをホストOSに同期している状態のため、ファイルは実際には存在しない。
3. composerは、解凍されたファイルにアクセスしようとするが、それらはまだホストOSに完全に同期されていないためno such file or directoryのエラーとなる。

つまり、ホストOSとゲストOSのファイル同期とライブラリファイルの解凍のタイミングにラグが生じていると考えられる。
※間違いあったら訂正お願いいたします。

回避策

unzipの実行完了のタイミングを遅らせてあげればよい。

1 unzipという名前のshell scriptをcomposer.jsonファイルが存在するディレクトリに配置する

unzip
#!/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

GitHubで編集を提案

Discussion