我正在使用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
答案 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
。没有它就会引用函数而不调用它。