我想在SBT中实现以下构建:
让我们以一个外部Lib为例,它存在于版本1.0,2.0,3.0和Scala 2.92,2.10.2中,我想编译,汇编和发布:
但是,默认情况下,我希望在单个版本中工作。只有在我启动发布流程时,才应编译,测试和组装所有版本。
有没有一种简单的方法在Sbt中实现这个多版本的构建?
答案 0 :(得分:9)
在sbt中使用多个Scala版本是相当普遍的,它被称为交叉构建或交叉发布。有关详细信息,请参阅sbt的Cross-building page。您所要做的就是:
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
来控制该方面。
针对外部库的交叉构建有点棘手。我能想到的壁橱情况是a plugin for Dispatch。在那里,我创建了一个名为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" }
以下是使用密钥添加依赖关系的方法:
libraryDependencies <++= (dispatchVersion) { (dv) => Seq(
"net.databinder.dispatch" %% "dispatch-core" % dv,
"net.databinder.dispatch" %% "dispatch-json4s-native" % dv
)}
对于Java库,它应该是%
而不是%%
:
libraryDependencies <++= (externalLibVersion) { (el) => Seq(
"org.apache" % "foo" % el,
"org.apache" % "foo-extention" % el
)}
除了制作像sbt-cross-building这样的自定义插件之外,没有简单的方法来迭代一系列外部版本。您可以编写如下的shell脚本:
sbt "set externalLibVersion := \"1.0\"" +assembly "set externalLibVersion := \"2.0\"" +assembly "set externalLibVersion := \"3.0\"" +assembly