如何在sbt中的测试任务之前附加自定义任务执行?

Pio*_*lka 19 sbt playframework

我正在使用SBT和Play Framework.

我创建了一个自定义TaskKey来在我的项目中运行JavaScript测试:

import sbt._
import sbt.Process._
import PlayProject._

object ApplicationBuild extends Build {

  val testJsTask = TaskKey[Unit]("testJs", "Run javascript tests.") := {}

  val main = PlayProject("xxx", 1.0, Seq())
    .settings(defaultScalaSettings: _*)
    .settings(testJsTask)
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.

testJsTask总是在有人执行test任务时运行它.

我想它应该是如下:

test in Test <<= (test in Test).dependsOn(testJsTask)
Run Code Online (Sandbox Code Playgroud)

我不知道应该如何准确定义.如何将依赖项添加到现有任务,如"test"或"build"?

UPDATE

在@Christian提出更改之后,构建定义如下所示:

object ApplicationBuild extends Build {
  val testJsTask = TaskKey[Unit]("testJs", "Run tests for javascript client.")
  def testJs = {}

  val main = PlayProject("xxx", 1.0, Seq())
    .settings(defaultScalaSettings: _*)
    .settings(testJsTask := testJs)

  (test in Test) <<= (test in Test) dependsOn (testJs)
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,该解决方案也不起作用:

[error] /xxx/project/Build.scala:21: not found: value test
[error]   (test in Test) <<= (test in Test) dependsOn (testJs)
[error]    ^
[error] one error found
[error] {file:/xxx/project/}default-f468ae/compile:compile: Compilation failed
Run Code Online (Sandbox Code Playgroud)

Chr*_*ian 14

这是一种方法:

定义任务键:

val testJsTask = TaskKey[Unit]("testJs", "Run javascript tests.")    
Run Code Online (Sandbox Code Playgroud)

在项目设置中定义任务:

testJsTask <<= testJs
Run Code Online (Sandbox Code Playgroud)

根据它进行测试:

(test in Test) <<= (test in Test) dependsOn (testJs)
Run Code Online (Sandbox Code Playgroud)

testJs可以定义如下:

  def testJs = (streams) map { (s) => {
    s.log.info("Executing task testJs")
    // Your implementation
  }
Run Code Online (Sandbox Code Playgroud)

[编辑]您必须在项目设置中定义任务依赖项.对于"正常"项目,您可以通过以下方式执行此操作:

  lazy val testProject = Project(
    "testProject",
    file("testProject"),
    settings = defaultSettings ++ Seq(
      testJsTask <<= testJs,
      (test in Test) <<= (test in Test) dependsOn (testJsTask)
    )
  )
Run Code Online (Sandbox Code Playgroud)


Jac*_*ski 13

Play 2.2.x使用SBT 0.13(参见Play 2.2中的新功能).这带来了一些组合任务的新方法build.sbt(不需要在project/子目录中使用Scala文件).

如果您碰巧使用Play 2.2.x,您可以build.sbt按如下方式定义任务之间的依赖关系:

lazy val testJsTask = taskKey[Unit]("Run JavaScript tests.")

testJsTask := {
  println("Running JavaScript tests...")
  java.util.concurrent.TimeUnit.SECONDS.sleep(3)
  println("...done.")
}

test in Test := {
  testJsTask.value
  (test in Test).value
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅SBT官方文档中的任务.

  • 据我所知,这是不正确的@htomek http://www.scala-sbt.org/release/docs/Custom-Settings.html#Execution+semantics+of+tasks使用`Def.sequential()`来运行任务按顺序http://www.scala-sbt.org/release/docs/Howto-Sequencing.html (3认同)