【发布时间】:2016-08-02 13:40:07
【问题描述】:
假设我有两个任务,doStart 和 doStop,我想在这些任务中包装一个现有任务(例如 test)。以下方法不起作用:
test := Def.sequential(doStart, test, doStop).value
它在运行时失败,并出现关于未解析设置键的错误。我觉得这其实很自然,因为Def.sequential展开成Def.taskDyn的嵌套序列,而且由于中间任务中引用了test任务,所以请求了它的“新”值,但此时它是显然不可用:
test := Def.taskDyn {
doStart.value
Def.taskDyn {
test.value
doStop
}
}.value
如果我引入一个临时任务并包装它而不是test:
val _testOriginal = taskKey[Unit]("Used for wrapping.")
_testOriginal := test.value
test := Def.sequential(doStart, _testOriginal, doStop)
然后我没有得到错误,但我得到了一个看起来像无限循环的东西,因为随后执行了 doStart,但 SBT 无限期挂起而不调用原始的 test 任务。这似乎也很自然,因为_testOriginal 取决于test 的当前值,而不是原始值。
我现在看到的唯一“解决方案”是引入我自己的任务,例如 testWrapped、testQuickWrapped 等,并告诉我构建的用户使用它们而不是 test/testQuick/etc .,但我真的不想这样做。那么,如何包装现有任务?
【问题讨论】: