【问题标题】:How to run a custom task(functional tests written in protractor) while the "run" task is up and running?如何在“运行”任务启动并运行时运行自定义任务(用量角器编写的功能测试)?
【发布时间】:2014-08-08 11:24:19
【问题描述】:

我正在开发基于 Play 框架构建的网络应用程序。

我想要实现的目标是创建一个像这样工作的自定义 sbt 任务:

  1. 启动播放应用程序
  2. 运行我的自定义任务(用 JavaScript 编写的功能测试,取决于正在运行的应用程序)
  3. 在我的自定义任务完成后停止应用程序

现在我被困在第二步了。

我有这个正在运行的 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,字符串, Seq[String]) => 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),
      _ => ())
  }

【问题讨论】:

  • 为什么runTask后面有下划线?
  • @Christian 当我省略 _ 时,sbt 抱怨没有足够的参数
  • 我不是游戏专家,但也许你应该使用 run 而不是 runTask(请参阅下面的答案)。
  • @Christian 是的,我试过了,它们都不起作用。请参阅下面的评论

标签: scala playframework sbt


【解决方案1】:

Run是一个Input Task,如果你想和普通任务一起使用,你得先把它转换成任务。

您可以使用toTask 方法从输入任务中获取任务,如in the documentation 所述。

myCustomTask <<= myCustomTask.dependsOn((run in Compile).toTask(""))

【讨论】:

  • 我刚试过,但是(在编译中运行)似乎是InputKey类型,并且没有定义toTask方法。
  • @CuiPengFei 你在使用至少 0.13.2 版本的 sbt,about 的输出是什么?
  • 哦,一定是这样。我使用的是 0.13.0,我认为它与 play 2.1 一起提供。我会尝试使用更新的版本。
  • 很好,现在可以使用了。当我运行 myCustomTask 时,“运行”开始。但问题是我的自定义任务中的脚本没有机会运行,因为“运行”没有停止。我创建此自定义任务的目的是在 play 应用程序启动并运行时运行量角器测试。
  • 我遇到了相同类型的错误,使用 sbt 0.13.6 和 scala 2.10.4
【解决方案2】:

我将使用以下内容来依赖run 任务:

myCustomTask <<= myCustomTask dependsOn run

在更改构建时,我还将使用sbt.Process API 来执行git status

"git version".!

它应该可以正常工作(r)进行更改。

【讨论】:

  • 我试过了,然后又试了一次。我收到此错误:错误:类型不匹配;找到: sbt.InputKey[Unit] 需要: sbt.Scoped.AnyInitTask (扩展为) sbt.Def.Initialize[sbt.Task[T]] forSome { type T } myCustomTask
  • 查看@lpiepiora 的答案。我错过了(没有先测试解决方案:()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-11
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多