Сборка нескольких версий с 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 Cross-building для подробностей. Все, что вам нужно сделать, это:
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, нет простого способа перебора последовательности внешних версий. Вы можете написать скрипт оболочки, например:
sbt "set externalLibVersion := \"1.0\"" +assembly "set externalLibVersion := \"2.0\"" +assembly "set externalLibVersion := \"3.0\"" +assembly