sbt包为不同的测试类型分开的罐子

时间:2013-04-04 16:23:22

标签: scala sbt

我们刚刚升级到在我们的项目中使用sbt 12.2。我想将我们的测试打包在单独的jar中,例如:project-unit.jar,project-integration.jar

我们当前的文件夹结构是:

src
 main
   ...
 test
   scala
     com.company.unit
     com.company.integration
     com.company.functional

非常感谢任何建议。

由于

1 个答案:

答案 0 :(得分:1)

我找到了一种方法:

  1. 为相应的测试类型创建打包任务:

    val integrationPackaging = TaskKey[File]("package-integration")
    
  2. 将包设置添加到测试设置:

    lazy val integrationTestSettings = createTestSettings("integration", IntegrationTests) ++ createPackageSettings("integration", IntegrationTests, integrationPackaging)
    
    private def createPackageSettings(testType: String, testConfiguration: Configuration, packagingTaskKey: TaskKey[sbt.File]) = {
      inConfig(testConfiguration)(Defaults.testSettings) ++
        Defaults.packageTaskSettings(packagingTaskKey, mappings in (Test, packageBin)) ++
        (artifactName in packagingTaskKey := {(scalaversion, moduleId, artifact) => "%s_%s-%s-%s.jar" format (moduleId.name, scalaversion.binary, buildVersion, testType)}) ++
        (mappings in packagingTaskKey ~= { (ms: Seq[(File,String)]) =>
          ms.filter { case (file, path) =>{ !file.getName.endsWith(".class") || file.getAbsolutePath.contains(testType) }
          }
        })
    }
    
  3. 请注意,在创建包设置中,我必须:

    • 添加默认测试设置以确保继承所有测试设置
    • 添加默认测试包任务设置(使用Test packageBin中的映射)
    • 添加artifactName(您希望jar名称是什么)
    • 添加包任务键的特定映射(在上面的步骤1中创建),这是它的关键,我必须定义一个过滤器,确保只包含包含testType的路径的文件(例如“integration”,“unit”选择“或”功能“)和资源文件(例如,不以”.class“结尾的文件)