【问题标题】:SBT How to pass input from one inputTask to another inputTaskSBT 如何将输入从一个 inputTask 传递到另一个 inputTask
【发布时间】:2014-10-27 05:36:24
【问题描述】:

我在使用 sbt v0.13.2 时遇到输入任务问题

我想要一个接受输入的任务,将该输入设置为系统属性,然后运行另一个任务,例如使用该系统属性的测试。

我需要在单独的任务中设置系统属性,因为过度属性在测试期间不可见。然而,在同一任务的后续运行期间,它是可见的。

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?

【问题讨论】:

    标签: sbt


    【解决方案1】:
    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")
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-11
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 2022-08-14
      相关资源
      最近更新 更多