使用自定义任务包装现有任务

时间:2016-08-01 13:43:35

标签: scala sbt

假设我有两个任务,doStartdoStop,我想在这些任务中包装现有任务(例如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的当前值,而不是原始值。

唯一的解决方案"我现在看到的是介绍我自己的任务,如testWrappedtestQuickWrapped等,并告诉我的构建用户使用它们而不是test / testQuick / etc但是,我真的不想这样做。那么,我如何包装现有任务呢?

1 个答案:

答案 0 :(得分:1)

test := doStop.dependsOn(test.dependsOn(doStart)).value

虽然仅供参考,但在测试的情况下,您可以使doStartdoStop不是任务,而是使用提供的testOptions工具,而是使用提供的testOptions in Test += Tests.Setup(() => ...) testOptions in Test += Tests.Cleanup(() => ... ) 工具。

ex