SBT: execute task using other task value

508 Views Asked by At

I redefine my tests to supply some arguments from configuration to test suite:

This is an excerpt from my 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
  }
}

This works ok.

Now, I wanted to give my test suite the name of an artifact like this:

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
}

But it shows the following error message:

[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

I know something about SBT internals, macros, task dependency graph, and I even managed to solve some of my tasks using scopes. Here I tried to use map or flatMap on (Keys.artifactPath in (Compile, packageBin)) but cannot achieve the desirted result. Whenever I try to access .value I get Illegal dynamic reference.

Please, guide me. I just need to pass the value of task to other task (inputKey) parameters.

SBT version: 0.13.5

2

There are 2 best solutions below

0
dmitry On BEST ANSWER

By trial and error I've done what I wanted eventually using Def.taskDyn (dynamic task):

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")
  }
}
1
Dale Wijnand On

I've never seen specifying test options via .toTask.

Do you want to see if testOptions in Test works for you? See the Options section of the Testing docs.