我们有一个 Shake 构建系统,其中一些规则与 Postgres 数据库对话,作为一个持久的后台服务。我们如何使用 Shake 确保服务在需要时启动,并在 Shake 完成后关闭?
特别是,如果没有规则使用它,我们不希望启动该服务,如果使用它,我们不希望它在运行期间多次启动/停止。
我们有一个 Shake 构建系统,其中一些规则与 Postgres 数据库对话,作为一个持久的后台服务。我们如何使用 Shake 确保服务在需要时启动,并在 Shake 完成后关闭?
特别是,如果没有规则使用它,我们不希望启动该服务,如果使用它,我们不希望它在运行期间多次启动/停止。
在 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
功能。