使用 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
等插件运行任务。
问题的一部分似乎是flywayClean
和flywayMigrate
都是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 测试