首页 > 解决方案 > 基于预定义配置参数的组合编写简洁的 sbt 配置

问题描述

我正在尝试尽可能多地从我的字符串中删除不必要的build.sbt字符串

sbt 提供了使用 Provide、Test 等作为配置参数的方法,如下所示:

"org.apache.spark" %% "spark-core" % "3.0.0" % Provided,

或者

"org.mockito" %% "mockito-scala" % "1.16.3" % Test,

但是如何重写更复杂的配置,例如:

"org.scalatest" %% "scalatest" % "3.2.3" % "test,it",

或者

.dependsOn(util % "compile->compile;test->test")

标签: scalasbt

解决方案


sbt 是(混蛋的)Scala 代码,所以你总是可以编写一些函数或扩展方法,例如:

def configs(head: Configuration, tail: Configuration*) =
  (head :: tail.toList).mkString(",")


implicit final class DependsOnProject(project: Project) {

  private val testConfigurations = Set("test", "fun", "it")
  private def findCompileAndTestConfigs(p: Project) =
      (p.configurations.map(_.name).toSet intersect testConfigurations) + "compile"

  private val thisProjectsConfigs = findCompileAndTestConfigs(project)
  private def generateDepsForProject(p: Project) =
      p % (thisProjectsConfigs intersect findCompileAndTestConfigs(p) map (c => s"$c->$c") mkString ";")

  def compileAndTestDependsOn(projects: Project*): Project =
    project dependsOn (projects.map(generateDepsForProject): _*)
}
"org.scalatest" %% "scalatest" % "3.2.3" % configs(Test, It)

projectA.compileAndTestDependsOn(util)

这只是一个示例,您可以编写自己的实用程序来满足您的需求。您也可以将这些Strings 分配给vals 并改用命名值。


推荐阅读