Как сделать разные подклассы для каждой версии Scala? - PullRequest
6 голосов
/ 28 апреля 2019

Вот моя структура проекта.Я хотел бы загрузить другой подкласс на основе версии scala во время выполнения. Базовый класс

root
   -- scala-parent (ParentClass)
   -- scala-2.10 (SubClassScala210)
   -- scala-2.11 (SubClassScala211)
   -- scala-2.12 (SubClassScala212)

находится в родительском scala, в то время как другие модули имеют другие подклассы.Я могу построить модуль подкласса (scala-2.10 / scala-2.11 / scala-2.12) для разных версий библиотек scala.Проблема в том, что я могу собрать только scala-parent только одну конкретную версию scala.

Мне интересно, как лучше всего решать подобные проблемы, как создавать подклассы для каждой версии scala?

Пожалуйста, предоставьте решение для maven, а не для sbt.

1 Ответ

6 голосов
/ 02 мая 2019

sbt-cross-build-depenon-example показывает, как кросс-сборка проекта, состоящего из нескольких подпроектов , где подпроекты разных версий Scala зависит от родительского проекта.

С учетом scala-parent проекта и scala-2.11 и scala-2.12 подпроектов, которые dependsOn scala-parent, тогда установите crossScalaVersions на scala-parent, а настройку scalaVersion для подпроектов, например,

lazy val scalaParent = (project in file("scala-parent")).settings(crossScalaVersions := Seq("2.11.0", "2.12.0"))
lazy val scala211  = (project in file("scala-2.11")).dependsOn(scalaParent).settings(scalaVersion := "2.11.0")
lazy val scala212  = (project in file("scala-2.12")).dependsOn(scalaParent).settings(scalaVersion := "2.12.0")

Также установите crossScalaVersions := Seq() для проекта root, который объединяет другие проекты:

lazy val root = (project in file("."))
  .aggregate(scalaParent, scala211, scala212)
  .settings(
    name := "sbt-cross-build-dependson-example",
    libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.5" % Test,
    crossScalaVersions := Seq() // https://github.com/sbt/sbt/issues/4262#issuecomment-405607763
  )

Теперь выполнение sbt +compile (обратите внимание на +) должно привести к перекрестной сборке проекта:

sbt:sbt-cross-build-dependson-example> +compile
[info] Setting Scala version to 2.12.0 on 2 projects.
...
[info] Updating scala212...
[info] Compiling 1 Scala source to /Users/mario/IdeaProjects/sbt-cross-build-dependson-example/scala-parent/target/scala-2.12/classes ...
[info] Compiling 1 Scala source to /Users/mario/IdeaProjects/sbt-cross-build-dependson-example/scala-2.12/target/scala-2.12/classes ...
...
[info] Setting Scala version to 2.11.0 on 2 projects.
...
[info] Updating scala211...
[info] Compiling 1 Scala source to /Users/mario/IdeaProjects/sbt-cross-build-dependson-example/scala-parent/target/scala-2.11/classes ...
[info] Compiling 1 Scala source to /Users/mario/IdeaProjects/sbt-cross-build-dependson-example/scala-2.11/target/scala-2.11/classes ...

Обратите внимание, как scala-parent был скомпилирован для 2.11 и 2.12

> tree -d -L 1 scala-parent/target/
scala-parent/target/
├── scala-2.11
├── scala-2.12

в то время как подпроекты создавались только для их соответствующих версий

> tree -d -L 1 scala-2.11/target/
scala-2.11/target/
├── scala-2.11

tree -d -L 1 scala-2.12/target/
scala-2.12/target/
├── scala-2.12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...