我有一个名为myTask
的现有任务,我无法控制其实现。
我想以这种方式重新定义它:
myTask := {
val x = prepare()
try
myTask.value
finally
cleanup(x)
}
您可能知道,此代码无效,因为我们无法控制何时执行myTask.value
。
prepare
调用 Def.sequential()
,使用cleanup
结构调用andFinally
。唯一的问题是cleanup
如何获得prepare()
的返回值
Def.sequential{
Def.task{
prepare()
},
myTask
}.andFinally(cleanup(???))
一种解决方法是使用全局变量,但这是一个肮脏的黑客。
有什么想法吗?
答案 0 :(得分:1)
我尝试使用全局变量,虽然它不是实现它的最优雅方式,但它可以正常工作。
我有:
摘要:
MyTasks.scala
<{1}}中的摘要:
object MyTasks {
var x = Option.empty[String]
def prepare(): String = ???
def cleanup(x: String): Unit = ???
}
通过这种方式,我们可以从build.sbt
获取状态,并绕过SBT限制。