Laravel5.5、Homesteadでホスト側の変更を捉える

タグ: Laravel5.5   Homestead  

Laravel Homesteadは、Laravelの開発環境を整えたVagrant Boxです。

ホスト側、つまりVagrantやHomesteadをインストールしている側のOS(MacやWindows、ときにLinux)のファイルシステムにより、共有ファイルへのファイル変更イベントがゲスト側で受け取れないことがあります。(大抵の環境では、うまく動作するようです。)

つまり、ホスト側の便利な、もしくは使いやすいツール(IDEや高機能エディタなど)でソースを変更し、その内容やタイムスタンプはHomestead環境で変更されているのに、ファイルシステムのイベントが発生しないことがあります。ファイルシステムのイベントは、新規作成や削除、変更を通知します。

Laravel Mixのwatchなどは、開発環境であるHomestead内で実行しなければ、意味がありません。しかし、このイベントが起きないと、変更を捉えられないため、何も再生成されません。

私の環境は、Vagrant Boxを置いているパーティションのファイルシステムがExt4のためか、通知が起きませんでした。そのため、Mixのwatchで更新されません。久しぶりに、Homestaedを使ってみようと思ったのに、これでは利便性が低くなります。

ヒント:多くのIDEや一部のエディターは、開発環境へ接続し、直接ソースを変更できる機能を持っています。そうした機能を使えば、ホストから起動しているHomestead内のソースを直接変更できます。つまり、ファイルの共有でイベントが通知されないと言う問題は無視できます。

解決策

Vagrantのプラグインである、vagrant-fsnotifyを使用します。

最初にVagrantへこのプラグインをインストールします。

vagrant plugin install vagrant-fsnotify

続いて、変更を通知する必要のあるファイルシステムの共有設定で、このプラグインを使用するよう指定します。

Homestead.yamlファイルですね。Homesteadドキュメントにかかれている設定に合わせたオプションの指定例です。もちろん、皆さんの環境に合わせ変更してください。

...
folders:
    - map: ~/code
      to: /home/vagrant/code
      options:
          fsnotify: true
...

続いて、vagrant upでHomesteadを起動します。残念ながら、fsnotifyは自動的には動作しません。このプラグインはホストのファイル変更を監視し、対応するファイルでイベントが起きるような操作に置き換える機能を提供しています。ですから、サーバー(サービス)動作させます。

vagrant fsnotify

実行するとターミナルへ制御は戻ってきません。動作を中止するときはCTRL+Cで停止させます。

その他の情報は、プラグインのリポジトリのReadmeを参照してください。