Как организовать код для нескольких scala версий и разных зависимостей - PullRequest
4 голосов
/ 18 марта 2020

Я хочу выпустить библиотеку для версий 2.12 и 2.13 scala. Но это зависит от другой библиотеки, которая существует только для 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.

Ответы [ 2 ]

3 голосов
/ 18 марта 2020

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

//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" */ }

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

2 голосов
/ 18 марта 2020

На основании lihaoyi и Что такое Scala версия-специфицированная c исходная директория в 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
...