我使用sbt v0.13.2
输入任务有问题我希望有一个接受输入的任务,将该输入设置为系统属性,然后运行另一个任务,例如使用该系统属性的测试。
我需要在单独的任务中设置系统属性,因为在测试期间不能看到overwise属性。但是在随后的同一任务中可以看到它。
lazy val setEnvironmentTask = taskKey[Unit]("Sets environment variable")
lazy val integrationTest = taskKey[Unit]("Runs integration test")
lazy val runIntegrationTest = taskKey[Unit]("Runs everything")
setEnvironmentTask := {
System.setProperty("checkEnv", "production")
}
integrationTest := {
(testOnly in Test).toTask(" integrations.MatchModelsIntegrationTest").value
}
runIntegrationTest := {
setEnvironmentTask.value
integrationTest.value
}
这样可行但是你可以在setEnvironmentTask中看到第二个参数是固定的。
我找不到解决方案。一些方法导致error: Illegal dynamic reference
,如下所示,其中两个任务更改为inputTasks并添加了导入:
import sbt.complete.Parsers.spaceDelimited
lazy val setEnvironmentTask = inputKey[Unit]("Sets environment variable")
lazy val runIntegrationTest = inputKey[Unit]("Runs everything")
setEnvironmentTask := {
val env = spaceDelimited("<arg>").parsed.head
System.setProperty("checkEnv", env)
}
runIntegrationTest := {
val env = spaceDelimited("<arg>").parsed.head
setEnvironmentTask.toTask(env).value // <<<<< this is there is fails with "error: Illegal dynamic reference: env"
integrationTest.value
}
应该像sbt runIntegrationTest production
总之,如何创建将输入传播到其他任务的inputTasks?
答案 0 :(得分:5)
import sbt.complete.Parsers.spaceDelimited
lazy val setEnvironmentTask = inputKey[Unit]("Sets environment variable")
lazy val runIntegrationTest = inputKey[Unit]("Runs everything")
lazy val integrationTest = taskKey[Unit]("Runs integration test")
lazy val setEnvTask: Def.Initialize[InputTask[Unit]] = Def.inputTask{
val env = spaceDelimited("<arg>").parsed.head
System.setProperty("checkEnv", env)
}
setEnvironmentTask <<= setEnvTask
runIntegrationTest := setEnvironmentTask.parsed.flatMap{ _ =>
integrationTest.taskValue
}.value
integrationTest := {
println("integration test")
}