SBT:使用其他任务值执行任务

时间:2015-04-29 10:26:04

标签: scala build sbt sbt-0.13

我重新定义了我的测试,以提供从配置到测试套件的一些参数:

这是我的Build.scala的摘录:

object Build extends Build {
  lazy val myProject = (project in file("my_project")).settings(
    test in Test := myProjectTest.value
  )

  val myProjectTest = Def.task {
    (testOnly in Test).toTask(" tests.Suites -- " +
      s"-Ddbserver=localhost " +
      s"-Ddbport=3306 ").value
  }
}

这没问题。

现在,我想给我的测试套件提供一个像这样的工件的名称:

val myProjectTest = Def.task {
  val art = (Keys.artifactPath in (Compile, packageBin)).value

  (testOnly in Test).toTask(" tests.Suites -- " +
    s"-Dartifact=${art.getCanonicalPath} " +
    s"-Ddbserver=localhost " +
    s"-Ddbport=3306").value
}

但它显示以下错误消息:

[error] /tmp/aa/project/Build.scala:17: Illegal dynamic reference: art
[error]     s"-Dartifact=${art.getCanonicalPath} " +
[error]                    ^
[error] one error found
[error] (compile:compileIncremental) Compilation failed

我知道关于SBT内部,宏,任务依赖图的 ,我甚至设法使用范围来解决我的一些任务。在这里,我尝试在(Keys.artifactPath in (Compile, packageBin))上使用map或flatMap,但无法实现精确的结果。每当我尝试访问.value时,我都会Illegal dynamic reference

请指导我。我只需要将task的值传递给其他任务(inputKey)参数。

SBT版本: 0.13.5

2 个答案:

答案 0 :(得分:0)

我从未见过通过.toTask指定测试选项。

您想看看testOptions in Test是否适合您?请参阅测试文档的Options部分。

答案 1 :(得分:0)

通过反复试验我最终使用Def.taskDyn(动态任务)做了我想做的事情:

object Build extends Build {
  lazy val myProject = (project in file("my_project")).settings(
    test in Test := myProjectTest.value
  )

  lazy val myProjectTest = Def.taskDyn {
    val art = (Keys.artifactPath in (Compile, packageBin)).value

    (testOnly in Test).toTask(" tests.Suites -- " +
      s"-Dartifact=${art.getCanonicalPath} " +
      s"-Ddbserver=localhost " +
      s"-Ddbport=3306")
  }
}