使用 SBT 如何在运行测试之前对插件中的任务进行排序

Posted

技术标签:

【中文标题】使用 SBT 如何在运行测试之前对插件中的任务进行排序【英文标题】:With SBT how do I sequence tasks from plugin before running a test 【发布时间】:2015-08-27 14:23:36 【问题描述】:

如何在运行测试之前运行来自插件(如 flyway)的顺序任务,例如,如果我想运行: flywayClean 然后flywayMigrate 然后integrationTests,我该怎么做?

问题是 sbt 并不真正支持任何有副作用的东西,比如 db。

我在这里查看了排序任务的示例: http://eed3si9n.com/sequencing-tasks-with-sbt-sequential

我已经尝试过这些,我可以按照基本示例进行操作,但我不知道如何通过 flyway 等插件运行任务。

问题的一部分似乎是flywayCleanflywayMigrate 都是TaskKey[Unit] 类型,其中sbt-sequential 示例使用Def.Setting[Task[Unit]]

sbt 非常复杂,以至于我无法弄清楚如何解析与给定 TaskKey 关联的 Task,然后将其转换为 Setting[Task[Unit]]

【问题讨论】:

【参考方案1】:

以下是如何让一个任务按顺序执行许多其他任务。这是你想做的吗?如果任务来自插件,则需要将其纳入范围。如果它来自自动插件,那么它的几乎所有任务都应该在范围内,而无需您明确导入它们。

lazy val mtaskA = taskKey[Unit]("a")

lazy val mtaskB = taskKey[String]("b")

lazy val mtaskC = taskKey[Int]("c")

mtaskA := 
    println("hello")


mtaskB := 
    "hello-2"


mtaskC := 
    2



lazy val cmp = taskKey[Unit]("cmp")

cmp := 
    mtaskA.value
    Thread.sleep(1000)
    println( mtaskB.value )
    Thread.sleep(1000)
    println( mtaskC.value )

【讨论】:

【参考方案2】:

我将我的 sbt 构建设置为执行 flywayClean,然后在运行测试之前执行 flywayMigrate

executeTests in Test := 
  (executeTests in Test).dependsOn(flywayMigrate.dependsOn(flywayClean)).value

【讨论】:

嗨,James,您如何专门为测试设置运行 flyway 任务。在我的构建中,我的测试环境有 flyway 变量:flywayUrl in Test := "jdbc:h2:/tmp/flyway:4200/" 我想为我的测试环境设置运行 flyway,而不是主要设置让我知道如果你请有线索 如果你想在配置好的测试 flyway 环境下运行 flyway,你应该编辑 James 的答案 ..... (executeTests in Test).dependsOn((flywayMigrate in Test).dependsOn( flywayClean in Test)).value

以上是关于使用 SBT 如何在运行测试之前对插件中的任务进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SBT Jenkins 插件运行特定测试以进行 ScalaTest 测试

SBT:如何 Dockerize 一个胖罐子?

测试 sbt 插件

使 SBT 子项目任务依赖于另一个子项目任务

sbt插件 - 如何确保我的settingKey在其他一切之前解决?

从 Eclipse 运行 SBT 任务