5

是否有可能使用 inotify (或任何 git-annex 和 Yesod 使用的)使 Shake 具有反应性,以便如果文件系统发生更改以暗示该规则应该执行,它会尽早这样做?

4

1 回答 1

8

Shake 的作者 Neil Mitchell 回答说:

有几种方法可以解决这个问题:

  1. 每次检测到某些变化时,您都可以重新运行 Shake。Shake 针对快速重建进行了高度优化,如果更改需要进行编译,那么 Shake 确定要重建什么的时间可能很短。无需更改 Shake。

  2. Shake 在启动时会做一些事情,比如读取 Shake 数据库。如果有需求,并且结果证明是及时的,我很乐意提供某种重新运行的 Shake 廉价 API - 这并不难做到。

  3. 当 Shake 进行重建检查时,它所做的最昂贵的事情是检查文件修改时间。如果 inotify 层给出了已更改文件的列表,我只能重新检查实际已更改的内容。对于一个大型项目,您可能会看到大约 1 秒的检查修改时间,因此它可能会为您带来一点好处,而且实施起来并不难。

  4. 如果 Shake 正在积极构建,然后发生了变化,您可以抛出异常,终止正在构建的任何内容,然后重新启动 Shake。Shake 已经过彻底测试,抛出异常,并且做正确的事。我知道至少有人以这种方式使用 Shake。

  5. 最后,如果 Shake 正在积极构建,您可以动态终止那些输入已更改的规则并再次执行。Shake 可以支持这个模型,但是这将是一个合理的工作量,并且需要重新设计一些部分。那将是完整的反应模型,但我怀疑它只有在您拥有大量文件并且一些文件几乎连续更改但大多数文件没有变化时才开始受益。

我们还确定将 Shake 与 Hobbes 等实用程序(也在 Hackage 上)相结合可以进行响应式构建。

于 2013-08-01T20:40:34.733 回答