inotify (または git-annex と Yesod が使用するもの) を使用して Shake を反応的にすることは可能でしょうか? ファイルシステムがそのルールを実行する必要があることを暗示するような方法で変更された場合、それはできるだけ早い機会に変更されますか?
1 に答える
シェイクの著者であるニール・ミッチェルは、次のように答えています。
これにアプローチするには、いくつかの方法があります。
何かが変更されたことを検出するたびに Shake を再実行できます。Shake は高速再構築用に高度に最適化されています。変更にコンパイルが必要な場合、Shake が何を再構築するかを判断する時間はおそらく最小限です。Shake を変更する必要はありません。
Shake データベースの読み取りなど、Shake が起動時に行う特定の処理があります。需要があり、それが時間の経過とともに顕著になることが判明した場合、私は喜んで何らかの種類の再実行 Shake 安価な API を提供します - それはそれほど難しいことではありません。
Shake が再構築チェックを行う場合、最もコストがかかるのはファイルの変更時間のチェックです。inotify レイヤーが変更されたファイルのリストを提供した場合、実際に変更されたものだけを再確認できました。大規模なプロジェクトの場合、変更時間をチェックするのに ~1 秒かかる可能性が高いため、おそらく少しは稼げるでしょうし、実装も難しくありません。
Shake がアクティブにビルドしているときに何かが変更された場合は、例外をスローし、ビルド中のものをすべて強制終了して、Shake を再起動できます。Shake は、スローされる例外を含めて徹底的にテストされており、正しいことを行います。Shake をこのように使っている人が少なくとも 1 人いることは知っています。
最後に、Shake がアクティブにビルドしている場合は、入力が変更されたルールだけを動的に終了して、再度実行することができます。Shake はこのモデルをサポートできますが、かなりの量の作業が必要であり、いくつかの部分を再設計する必要があります。これは完全なリアクティブ モデルですが、膨大な数のファイルがあり、いくつかのファイルがほぼ継続的に変更されていて、ほとんどのファイルがそうではない場合にのみ、メリットがあると思います。
また、Shake を Hobbes (Hackage にもある) などのユーティリティと組み合わせることで、リアクティブ ビルドが可能になることもわかりました。