【メモ】Vagrant では npm run watch が動作しない【#np2020】

Laravelで静的ファイルを更新した場合、Laravel-mixを使ってコンパイルするわけですが、今の僕のサイズで1回あたり40秒ぐらい掛かるので、頻繁にコードを書き換える必要があるときには結構煩雑。出来ればこうもっとパパッとやって欲しい、バックグラウンドでやっておいて欲しい。



というわけで、「Watch」というスクリプトが用意されていて、それを実行するとソースの変更を監視し続けて必要に応じて自動でコンパイルしてくれるという素敵機能なんですが、動かないんですよねこれが。コンソールを見る限り、変更を待っているように見えるけど実際はうんともすんとも言いません。


理由は多分この辺にあるのと同じことで、


さらにさらに、chokidarはMac上で実行された場合はfsevents、それ以外はnodejsのfs.watch系の機能を使うようです。
んで、fs.watchにはこんな悲しい記述が。。。

If the underlying functionality is not available for some reason, then fs.watch will not be able to function. For example, watching files or directories can be unreliable, and in some cases impossible, on network file systems (NFS, SMB, etc), or host file systems when using virtualization software such as Vagrant, Docker, etc. You can still use fs.watchFile, which uses stat polling, but it is slower and less reliable.

要は、ポーリングしろということですな。

nfsをgulp watchできない時にやったこと – FILES=0


Vagrant上では動かないってことなんでしょうね。職場の開発環境ではきちんと動いているのになぜなんだ……と思ったらそうか、あれはVagrant上で動かしてるんじゃなくて、Mac上で動いてるんでした。なるほどそれなら動くのね。


watch-poll を使いましょう


npm run watch-poll

これで幸せになれました。
どうせWatchが動かないなら、scripts自体を書き換えてしまっても良いかも。



ちなみに前任者設計の職場の環境では、devコマンドにwatchオプションが付いてて、コンパイルすると自動的に監視モードになるようになってました。コンパイルだけなんてしないでしょ、的な。つよい。