SBT如何将输入从一个inputTask传递到另一个inputTask

时间:2014-09-02 20:48:49

标签: sbt

我使用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?

1 个答案:

答案 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")
}