Многострочная версия с 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?

Ответ 1

перекрестное здание

Наличие нескольких версий Scala в sbt довольно распространено и называется перекрестным построением или перекрестной публикацией. Подробнее см. Sbt Страница кросс-строительной техники. Все, что вам нужно сделать, это:

scalaVersion := "2.10.2"

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

В соответствии с соглашением об именах sbt в опубликованном артефакте будет исправлено сообщение о бинарной версии, которое _2.10 для Scala 2.10.x и _2.9.2 для Scala 2.9.2. Это необходимо для использования бинарной совместимости между сериями 2.10. Вы можете использовать crossVersion для управления этим аспектом.

перекрестное построение против внешней библиотеки

Перекрестное построение против внешней библиотеки немного сложнее. Сложная ситуация, о которой я могу думать, - плагин для 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, нет простого способа повторить последовательность внешних версий. Вы можете написать оболочку script как:

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