在 Shake 中使用持久服务

Using persistent services with Shake

我们有一个 Shake 构建系统,其中一些规则与 Postgres 数据库对话,作为持久的后台服务。我们如何使用 Shake 来确保服务在需要时启动,并在 Shake 完成后关闭?

特别是,如果没有规则使用它,我们不想启动该服务,如果使用它,我们不想在 运行 期间多次 started/stopped ].

在 Shake 中实现此模式的一种方法是:

rules = do
    startService <- newCache $ \() -> do
        ... start the service here ...
        runAfter $ ... shut down the service here ...

    "*.txt" %> \out -> do
        startService ()
        ... use the service here ...

我们创建了一个名为 startService 的缓存项。使用 newCache 操作将最多执行一次,仅在需要时执行。我们可以启动服务但是有意义(甚至可能首先构建服务)。我们使用runAfter来关闭服务,在Shake执行完成后运行。

为了确保服务在任何需要的规则中可用,我们首先调用 startService ()

作为一项相关功能,如果您有一条规则,您不需要持久服务,而只是为了批量操作,请参阅 batch 函数。