假设我有两个任务,doStart
和doStop
,我想在这些任务中包装现有任务(例如test
)。以下不起作用:
test := Def.sequential(doStart, test, doStop).value
它在运行时因未解决的设置键错误而失败。我认为这实际上非常自然,因为Def.sequential
扩展为Def.taskDyn
的嵌套序列,并且由于test
任务在中间任务中被引用,因此{" new&#34} ;请求值,但此时它显然不可用:
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但是,我真的不想这样做。那么,我如何包装现有任务呢?
答案 0 :(得分:1)
test := doStop.dependsOn(test.dependsOn(doStart)).value
虽然仅供参考,但在测试的情况下,您可以使doStart
和doStop
不是任务,而是使用提供的testOptions
工具,而是使用提供的testOptions in Test += Tests.Setup(() => ...)
testOptions in Test += Tests.Cleanup(() => ... )
工具。
ex