我试图覆盖sbt中的it:run
任务,以便它按顺序运行另外两个任务(实际上是三个,如果你包括日志记录)。第一项任务是配置应用程序(it:provision
),第二项是实际运行测试(it:test
)。
我开始使用简单Task[Unit]
进行自定义provision
任务。
lazy val provision = taskKey[Unit]("Provisions the application in an environment based on the configuration.")
然后我定义了一个用于it:run
实现的函数:
def runIntegrationTestsImpl(): Initialize[Task[Unit]] = Def.inputTask {
Def.sequential(
provision in IntegrationTest,
Def.task(state.value.log.info("Running integration tests.")),
test in IntegrationTest
).value
}
这很好用。然而,我真正想要的是将配置任务设为InputTask[Unit]
。
所以我随后将provision
更改为:
lazy val provision = inputKey[Unit]("Provisions the application in an environment based on the configuration.")
并尝试更新it:run
实施:
def runIntegrationTestsImpl(): Initialize[InputTask[Unit]] = {
val parser = DefaultParsers.any.*.map(_.mkString)
Def.inputTask {
val prov = (provision in IntegrationTest).toTask(parser.parsed)
Def.sequential(
prov,
Def.task(state.value.log.info("Running integration tests.")),
test in IntegrationTest
).value
}
}
这就像我编译它一样接近。我并不打算在这里解析参数,但似乎toTask
是获得Initialize[Task[Unit]]
的唯一方法。
无论我尝试做什么,我仍然无法摆脱以下错误:
非法动态参考:prov
这是指序列中的第一个元素。
我似乎用sbt宏来解决这个问题。有没有办法达到我想要的目的?