Vagrant で NFS 使っての開発環境で、ローカルでファイル変更してるんだけど VM 上の plack -R が変更検知してくれないなぁ、とおもってしばらく使ってたけど、やっぱり不便なので調べたらどうやらこれは NFS と Inofity の問題でどうしようもなさそうだった。
http://stackoverflow.com/questions/4231243/inotify-with-nfs
-R の実装である Plack::Loader::Restarter が使う Filesys::Notify::Simple では Linxu::Inofity2 なければ、<:Find> 使ってフルスキャンしつつの変更検知ができるようにはなってる。それでええやん、というのもあるがバッテリー作業時の電池節約もしたいので別の方法を模索。
今回はもともと Grunt 使ってたのもありどうせならということで Grunt で完結するようにしてみた。
<:Server::PSGI> 使ってたこんなような Procfile のところを、
admin: plackup -p 9001 -R lib -a conf/admin.psgi
(どうせ本番で使う)Server::Starter + Starlet の構成にして pid をファイルに記録しつつの起動に変更。
admin: start_server --port=9001 --pid-file=var/run/admin.pid -- plackup -a conf/admin.psgi -s Starlet --max-workers=1
Grunt では watch で .pm ファイル達を監視しつつの exec するタスクを追加。
watch:
apps:
files: ['lib/**/*.pm']
tasks: ['exec:reload']
exec:
reload:
command: 'vagrant ssh -c "kill -HUP `cat /vagrant/var/run/admin.pid`" -- -t'
これでローカルで Grunt 走らせておけば変更検知しての再起動がいい感じに。
ただし、grunt-contrib-watch は非常に負荷が高いようなので grunt-este-watch に移行したほうが良さそう(ファイル数にもよるだろうけど実際ロードが 20% ぐらい上がった)。
http://tech.nitoyon.com/ja/blog/2013/10/10/grunt-watch-slow/
とりあえずまともに動く plack -R の代替ができて普通の状態に戻った。