【问题标题】:Multi-version build with SBT使用 SBT 构建多版本
【发布时间】:2013-08-24 19:47:34
【问题描述】:

我想在 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 中实现这种多版本构建?

【问题讨论】:

  • externalLib 本身是针对 2.9.2 和 2.10.2 交叉发布的 scala 库吗?还是一个简单的java库?

标签: sbt


【解决方案1】:

跨建筑

在 sbt 中拥有多个 Scala 版本是相当普遍的,这被称为交叉构建或交叉发布。有关详细信息,请参阅 sbt 的 Cross-building page。您所要做的就是:

scalaVersion := "2.10.2"

crossScalaVersions := Seq("2.10.2", "2.9.2")  

根据 sbt 的命名约定,您发布的工件将具有二进制版本的 post fix,对于 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

【讨论】:

猜你喜欢
  • 2017-05-31
  • 1970-01-01
  • 2018-06-05
  • 2015-05-04
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 2018-08-06
相关资源
最近更新 更多