我正在开发一个在Play Framework上构建的网络应用。
我想要实现的目标是创建一个像这样工作的自定义sbt任务:
现在我被困在第二步了。
我有这个正在运行的sbt脚本:
lazy val anotherTask = taskKey[Unit]("run this first")
lazy val myCustomTask = taskKey[Unit]("try to run shell in sbt")
anotherTask := {
println("i am the first task")
}
myCustomTask := {
println("try to run shell")
import scala.sys.process._
println("git status" !!)
println("the shell command worked, yeah!")
}
myCustomTask <<= myCustomTask.dependsOn(anotherTask)
但是,如果我尝试通过修改脚本来使myCustomTask
依赖于run
任务(启动播放应用):
myCustomTask <<= myCustomTask.dependsOn(runTask _)
我收到以下错误:
错误:类型不匹配;发现:( sbt.Configuration,String, Seq [String])=&gt; sbt.Def.Initialize [sbt.Task [Unit]]必需: sbt.Scoped.AnyInitTask (扩展为)sbt.Def.Initialize [sbt.Task [T]] forSome {type T}
我该如何解决这个问题?
最后,我最终得到了这样的specs2类:
"my app" should {
"pass the protractor tests" in {
running(TestServer(9000)) {
Await.result(WS.url("http://localhost:9000").get, 2 seconds).status === 200
startProtractor(getProcessIO) === 0
}
}
}
private def startProtractor(processIO: ProcessIO): Int = {
Process("protractor", Seq( """functional-test/config/buildspike.conf.js"""))
.run(processIO)
.exitValue()
}
private def getProcessIO: ProcessIO = {
new ProcessIO(_ => (),
stdout => fromInputStream(stdout).getLines().foreach(println),
_ => ())
}
答案 0 :(得分:4)
运行是Input Task,如果要将其与普通任务结合使用,则必须先将其转换为任务。
您可以使用toTask
方法从输入任务中获取任务,如in the documentation所述。
myCustomTask <<= myCustomTask.dependsOn((run in Compile).toTask(""))
答案 1 :(得分:0)
我会使用以下内容来依赖run
任务:
myCustomTask <<= myCustomTask dependsOn run
在更改构建时,我还会使用sbt.Process API来执行git status
。
"git version".!
应该可以正常工作(r)。