Haskell 如何使用Shake库构建反应式构建系统?

Haskell 如何使用Shake库构建反应式构建系统?,haskell,reactive-programming,shake-build-system,Haskell,Reactive Programming,Shake Build System,有没有可能使用inotify(或git附件和YesSOD使用的任何东西)使Shake成为反应式的,这样,如果文件系统以暗示应该执行规则的方式发生变化,它就会尽早执行?Shake的作者尼尔·米切尔(Neil Mitchell)回答说: 有几种方法可以实现这一点: 您可以在每次检测到某些内容时重新运行Shake 改变。Shake经过高度优化,可实现快速重建(如果更改 需要进行编译,然后是Shake找出原因的时间 重建可能是最小的。不需要改变就可以震动 Shake在启动时会做一些事情,比如阅读 摇动数

有没有可能使用inotify(或git附件和YesSOD使用的任何东西)使Shake成为反应式的,这样,如果文件系统以暗示应该执行规则的方式发生变化,它就会尽早执行?

Shake的作者尼尔·米切尔(Neil Mitchell)回答说:

有几种方法可以实现这一点:

  • 您可以在每次检测到某些内容时重新运行Shake 改变。Shake经过高度优化,可实现快速重建(如果更改 需要进行编译,然后是Shake找出原因的时间 重建可能是最小的。不需要改变就可以震动

  • Shake在启动时会做一些事情,比如阅读 摇动数据库。如果有需求,结果是 值得一提的是,我很乐意提供一个便宜的重新运行Shake API 某种程度上,这并不难做到

  • 当Shake进行重建检查时,最昂贵的事情是 正在检查文件修改时间。如果inotify层给出 更改的文件列表我只能重新检查 实际上已经改变了。对于大型项目,您可能会看到~1 检查修改时间,所以它可能会为您带来一些好处 实施起来并不难

  • 如果Shake正在积极构建,然后有些东西发生了变化,那么 可能引发异常,杀死正在构建的任何东西,然后重新启动 摇Shake已经过全面测试,并抛出异常 做正确的事。我知道至少有一个人用奶昔 就这样

  • 最后,如果Shake正在积极构建,您可以动态地 只终止那些输入已更改的规则,然后再次执行。 Shake可以支持此模型,但它将是一个合理数量的 工作,并需要重新设计一些部件。那就够了 被动模式,但我怀疑只有当你 拥有大量的文件,并且一些文件几乎正在更改 连续,但大多数文件不是


  • 我们还确定,将Shake与Hobbes这样的实用程序(也在Hackage上)相结合可以实现反应性构建。

    这个问题似乎离题了,因为它是对Shake的功能要求,而不是编程问题。@PetrPudlák我将这个问题解释为“如何使用Shake库构建反应性构建系统?”,因为至少有一个答案不需要新功能。我使用Shake作为生成管理器,第2步对我来说大约需要300毫秒,这对于任何合理的自动轮询方法来说都太慢了。@nominolo如果这对您有关系,请告诉我,我将重做API以避免重新运行的开销。如果您的用例有一个Haskell配置文件,我很乐意看到它,因为它可能会识别出300ms中的其他故障。