使用SBT进行多版本构建

Edm*_*984 7 sbt

我想在SBT中实现以下构建:

  • 有多个scala版本
  • 有多个目标版本(因为库依赖)

让我们以一个外部Lib为例,它存在于版本1.0,2.0,3.0和Scala 2.92,2.10.2中,我想编译,汇编和发布:

  • MyProject_externalLib1.0_scala_2.9.2
  • MyProject_externalLib1.0_scala_2.10.2
  • MyProject_externalLib2.0_scala_2.9.2
  • MyProject_externalLib2.0_scala_2.10.2
  • MyProject_externalLib3.0_scala_2.9.2
  • MyProject_externalLib3.0_scala_2.10.2

但是,默认情况下,我希望在单个版本中工作.只有在我启动发布流程时,才应编译,测试和组装所有版本.

有没有一种简单的方法在Sbt中实现这个多版本的构建?

Eug*_*ota 9

跨建筑

在sbt中有多个Scala版本是相当普遍的,它被称为交叉构建或交叉发布.有关详细信息,请参阅sbt的交叉构建页面.你所要做的就是:

scalaVersion := "2.10.2"

crossScalaVersions := Seq("2.10.2", "2.9.2")  
Run Code Online (Sandbox Code Playgroud)

根据sbt的命名约定,您发布的工件将具有二进制版本后修复,_2.10适用于Scala 2.10.x和_2.9.2Scala 2.9.2.这是为了利用2.10系列之间的二进制兼容性.您可以使用它crossVersion来控制该方面.

跨越外部图书馆建设

跨外部库的交叉构建有点棘手.我能想到的壁橱情况是Dispatch的一个插件.在那里,我创建了一个名为的自定义设置dispatchVersion:

lazy val dispatchVersion = SettingKey[String]("x-dispatch-version")
Run Code Online (Sandbox Code Playgroud)

这是在buildSettingsas中设置的

dispatchVersion := "0.10.1"
Run Code Online (Sandbox Code Playgroud)

和我的版本前缀为dispatch0.10.0_:

version <<= dispatchVersion { dv => "dispatch" + dv + "_0.1.0" }
Run Code Online (Sandbox Code Playgroud)

以下是使用密钥添加依赖项的方法:

libraryDependencies <++= (dispatchVersion) { (dv) => Seq(
  "net.databinder.dispatch" %% "dispatch-core" % dv,
  "net.databinder.dispatch" %% "dispatch-json4s-native" % dv
)}
Run Code Online (Sandbox Code Playgroud)

对于Java库,它应该%代替%%:

libraryDependencies <++= (externalLibVersion) { (el) => Seq(
  "org.apache" % "foo" % el,
  "org.apache" % "foo-extention" % el
)}
Run Code Online (Sandbox Code Playgroud)

除了制作像sbt-cross-building这样的自定义插件之外,没有简单的方法来迭代一系列外部版本.您可以编写一个shell脚本,如:

sbt "set externalLibVersion := \"1.0\"" +assembly "set externalLibVersion := \"2.0\"" +assembly "set externalLibVersion := \"3.0\"" +assembly
Run Code Online (Sandbox Code Playgroud)