ファイルの変更を検知して自動でビルドする系のツールが動かないので調べたがダメだった雑記
Linux とかファイルシステムとか履修してないのでくわしくないんですけど。やってみたらできた、っていうクックパッド的レシピです。
mac と IntelliJ と時々 Docker で開発してまして、なんだか変更検知がうまく働かないなあとおもっておりました。
たとえば、 Webpack-dev-server とか、 Cargo Watch とか。
きょうはイライラしててこいつをやっつけたい気分だったので原因を調べてみました。
Cargo Watch のREADME を読んでたら大ヒットおめでとうな文章が書いてありました。
If file updates seems to never trigger
Try using --poll to force the polling fallback.
If that still doesn't work, and you're using an editor that does "safe saving", like IntelliJ / PyCharm, you may have to disable "safe saving" as that may prevent file notifications from being generated properly.
雰囲気訳すると、
「
ファイルを更新しても発火しないとき
--poll オプションを使ってください。
それでもまだダメで、お前の使っているエディタが IntelliJ や PyCharm のような "safe saving" をしている場合、 それを切れ。
」
Safe Saving
なんでしょうこれは。
stack overflow に関連質問がありました。
ファイルの変更を、直接ファイルに書き込むのではなくて、一時ファイルに書き込み、元ファイルを削除し一時ファイルを復元する というファイルの変更方法のことみたい。
このことによって、直接ファイルの更新するときになにかエラーが起きてファイルが失われることを防いでくれる、というメリットがあるみたい。
IntelliJ公式の説明を見ると、
Before saving the file, create a backup. If the save operation is successful, the backup is deleted. If not, the contents of the original file are restored from backup. This behavior is known as "safe write" and it prevents losing your file in case of a faulty save operation.
「
ファイルを保存する前に、バックアップを作成します。保存が成功したらバックアップは削除されます。もし保存に失敗したら、バックアップからファイルをリストアします。こういうふるまいは "safe write" として知られており、保存時のファイル消失を避けてくれます。
」
OKOK、わかった、とにかく保存時にファイルが消し飛ばないっていうメリットがあるんだね。
そのメリットよりも、変更検知自動ビルドの恩恵にあずかりたいので、 IntelliJ の "safe saving" とやらを切ってみます。
Preferences から、 適当なワードで検索すると、この設定項目が出てきます
このチェックボックスを外して, OK!!!!!!!これで勝つる!!!!!!!!!!
勝てませんでした。変更が検知されません。
そもそもホスト側で変更したファイルのイベントがコンテナ内で発火してないんでしょうか。
https://docs.docker.jp/docker-for-mac/osxfs.html#file-system-events
大部分の inotify イベントはバインド・マウントでサポートしています。また、 dnotify と fanotify (あまりよくテストされていません)もサポートしています。つまり、macOS からのファイルシステムイベントは、コンテナ内のプロセスに対しても送信され、あらゆるリッスンしているプロセスがトリガとなります。
だそうですが。私はそうはおもいません。だれかたすけてください。