Как организовать код для нескольких версий scala и различных зависимостей

Мне нужна библиотека выпуска для версии scala 2.12 и 2.13. Но это зависит от другой библиотеки, которая существует только для версии 2.12. Для 2.13 я написал свою реализацию для функции fast:

2.12 код выглядит так:

import com.dongxiguo.fastring.Fastring.Implicits._ //2.12 only

object Lib {
   val a = fast"hello world"
}

2.13 код выглядит так:

import mycompat.Implicits._ //2.13 only

object Lib {
   val a = fast"hello world" //my implementation
}

Так что отличие - только import ... в нескольких файлах.

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


person zella    schedule 18.03.2020    source источник
comment
Этот ответ может быть полезен: подберите другой исходный файл для другой версии Scala (использует sbt, но если вы используете gradle или maven должен быть какой-то аналогичный механизм). При таком подходе вам нужно будет создать Lib дважды — один раз в 2.12 (который будет использовать com.dongxiguo.fastring) и один в 2.13 (который будет использовать mycompat). И при условии, что они имеют точно такие же имена и содержание, остальная часть приложения будет счастлива с ним... за исключением, вероятно, faststring в 2.12 и 2.13, которые будут разных типов. и он взорвется.   -  person J0HN    schedule 18.03.2020


Ответы (2)


Наличие разных импортов проблематично, потому что это означает, что у вас разные источники (и вам нужно их поддерживать). Я думаю, что предоставление отсутствующей реализации библиотеки в собственном оригинальном пакете будет лучшим решением.

//main/scala-2.13/com/dongxiguo/fastring/Fastring/Implicits.scala
package com.dongxiguo.fastring.Fastring
object Implicits {
  //your implementation of fast"Something"
}

Пока он находится в папке scala-2.13, он будет скомпилирован и использован только для scala-2.13.

Вам также нужны разные зависимости для версий 2.12 и 2.13:

libraryDependencies ++= {
  CrossVersion.partialVersion(scalaVersion.value) match {
    case Some((2, 12)) => Seq("com.dongxiguo" %% "fastring" % "1.0.0")
    case Some((2, 13)) => Seq()
    case _ => Seq()
  }
}

У вас будет такая же реализация Lib без каких-либо изменений для scala 2.13, и когда fastring будет выпущена для новой версии scala, вы просто удалите эти части.

Вы также можете создать свой собственный прокси-объект, который будет иметь разные реализации для 2.12 и 2.13 в mycompat.Implicits._.

//main/scala-2.13/mycompat/Implicits.scala
package com.mycompat
object Implicits { /* proxy to fast"Something" from fastring library */ }

//main/scala-2.12/mycompat/Implicits.scala
package com.mycompat
object Implicits { /* your implementation of fast"Something" */ }

Это тоже хорошая идея.

person Scalway    schedule 18.03.2020
comment
Спасибо за подсказку! Только что понял, что CrossVersion.partialVersion можно использовать не только для настройки параметров скалака :) /jsoniter-скала/коммит/ - person Andriy Plokhotnyuk; 18.03.2020

На основе lihaoyi и Каковы исходные каталоги версии Scala в sbt? попробуйте что-нибудь вот так

src/main/scala/example/Hello.scala:

package example

object Hello extends Greeting with App {
  println(greeting)
}

src/main/scala-2.11/example/Greeting.scala:

package example

trait Greeting {
  lazy val greeting: String = "hello-from-2.11.12"
}

src/main/scala-2.13/example/Greeting.scala:

package example

trait Greeting {
  lazy val greeting: String = "hello-from-2.13.1"
}

build.sbt:

crossScalaVersions := List("2.13.1", "2.11.12")

Теперь sbt ++2.11.12 run выводит

hello-from-2.11.12

пока sbt ++2.13.1 run выводит

hello-from-2.13.1
person Mario Galic    schedule 18.03.2020