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

时间:2011-12-18 21:34:34

标签: playframework sbt

我正在使用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)
}

到目前为止一切顺利。

我想在有人执行testJsTask任务时始终运行此test

我想它应该是如下:

test in Test <<= (test in Test).dependsOn(testJsTask)

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

更新

在@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)
}

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

[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

3 个答案:

答案 0 :(得分:14)

这是一种方法:

定义任务键:

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

在项目设置中定义任务:

testJsTask <<= testJs

使测试依赖于它:

(test in Test) <<= (test in Test) dependsOn (testJs)

testJs可以定义如下:

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

[编辑]您必须在项目设置中定义任务依赖项。对于 一个“正常”项目,您可以通过以下方式完成:

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

答案 1 :(得分:12)

Play 2.2.x使用SBT 0.13(参见What’s new in 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
}

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

答案 2 :(得分:0)

对我来说,使用 dependsOn 语法不起作用。相反,我使用了测试的 setup functionality sbt

在您的示例中,它将类似于以下内容:

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

testJsTask := {
  // ...whatever logic
}

// then inside your project settings
Test / testOptions += Tests.Setup(() => testJsTask.value)

请注意末尾的 .value。没有它就会引用函数而不调用它。