使用SBT的多版本构建

使用SBT的多版本构建,sbt,Sbt,我想实现以下内置SBT: 有多个scala版本的 具有多个目标版本(由于库依赖关系) 让我们以1.0、2.0、3.0版和Scala 2.92、2.10.2版中存在的外部库为例,我希望编译、组装和发布: MyProject_外部IB1.0_scala_2.9.2 MyProject_外部IB1.0_scala_2.10.2 MyProject_外部IB2.0_scala_2.9.2 MyProject_外部IB2.0_scala_2.10.2 MyProject_外部IB3.0_scala_

我想实现以下内置SBT:

  • 有多个scala版本的
  • 具有多个目标版本(由于库依赖关系)
让我们以1.0、2.0、3.0版和Scala 2.92、2.10.2版中存在的外部库为例,我希望编译、组装和发布:

  • MyProject_外部IB1.0_scala_2.9.2
  • MyProject_外部IB1.0_scala_2.10.2
  • MyProject_外部IB2.0_scala_2.9.2
  • MyProject_外部IB2.0_scala_2.10.2
  • MyProject_外部IB3.0_scala_2.9.2
  • MyProject_外部IB3.0_scala_2.10.2
但是,默认情况下,我希望在单个版本中工作。只有当我启动发布流程时,才应该编译、测试和组装所有版本

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

跨构建 在sbt中有多个Scala版本是相当常见的,称为跨构建或跨发布。有关详细信息,请参见sbt。你所要做的就是:

scalaVersion := "2.10.2"

crossScalaVersions := Seq("2.10.2", "2.9.2")  
根据sbt的命名约定,您发布的工件将具有二进制版本的后期修复,对于Scala 2.10.x是
_2.10
,对于Scala 2.9.2是
_2.9.2
。这是为了利用2.10系列之间的二进制兼容性。您可以使用
crossVersion
来控制该特性

与外部图书馆的交叉建筑 与外部库的交叉构建有点棘手。我能想到的最隐秘的情况是。在那里,我创建了一个名为
dispatchVersion
的自定义设置:

lazy val dispatchVersion = SettingKey[String]("x-dispatch-version")
这在
buildSettings
中设置为

dispatchVersion := "0.10.1"
而我的版本前缀为
dispatch0.10.0\

version <<= dispatchVersion { dv => "dispatch" + dv + "_0.1.0" }
除了制作一个自定义插件,没有简单的方法可以迭代一系列外部版本。您可以编写如下shell脚本:

sbt "set externalLibVersion := \"1.0\"" +assembly "set externalLibVersion := \"2.0\"" +assembly "set externalLibVersion := \"3.0\"" +assembly

externalLib
本身是一个scala库,它是针对2.9.2和2.10.2交叉发布的吗?或者它是一个简单的java库?有没有办法为不同的子项目设置不同的sbt版本?@Alex你应该打开一个单独的问题,而不是在评论中问我。
libraryDependencies <++= (externalLibVersion) { (el) => Seq(
  "org.apache" % "foo" % el,
  "org.apache" % "foo-extention" % el
)}
sbt "set externalLibVersion := \"1.0\"" +assembly "set externalLibVersion := \"2.0\"" +assembly "set externalLibVersion := \"3.0\"" +assembly