【问题标题】:With SBT how do I sequence tasks from plugin before running a test使用 SBT 如何在运行测试之前对插件中的任务进行排序
【发布时间】: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]]

【问题讨论】:

    标签: sbt flyway


    【解决方案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
      猜你喜欢
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 2014-06-14
      • 2017-11-13
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多