根据 scalaVersion 设置依赖项/插件版本

Posted

技术标签:

【中文标题】根据 scalaVersion 设置依赖项/插件版本【英文标题】:Set Dependencies / Plugins versions depending on scalaVersion 【发布时间】:2021-12-18 21:56:20 【问题描述】:

我正在尝试为我的build.sbt 脚本上的依赖项和插件设置不同的版本,具体取决于crossCompiled 项目中scalaVersion 的值。

这是我目前所拥有的简化和简化的表示:

scalaVersion := "2.11.12"
crossScalaVersions := Seq("2.11.12", "2.12.14")


val currentDependencies = Def.setting 
  scalaVersion.value match 
    case "2.11.12" => new 
      val circe         = "0.12.0-M3"
      val kindProjector = "0.10.3"
    

    case "2.12.14" => new 
      val circe         = "0.14.1"
      val kindProjector = "0.13.2"
    
  


libraryDependencies ++= Seq (
  "io.circe" %% "circe-core" % currentDependencies.value.circe
)

addCompilerPlugin(
  "org.typelevel" %% "kind-projector" % currentDependencies.value.kindProjector
)


libraryDependencies 部分是正确的,即使不强制添加 .value 部分会更简洁。

理想情况下,我会简单地声明一个Map(scalaV1 -> dep1 -> v1, scalaV2 -> dep1 -> v2 )

但我遇到的问题是关于addCompilerPlugin,因为它没有发生在任务或设置中,我收到以下错误:

error: `value` can only be used within a task or setting macro, such as :=, +=, ++=, Def.task, or Def.setting.

有没有更简洁的方法来实现我想要做的事情?以及如何根据非任务的 scalaVersion 获得正确的依赖版本?

【问题讨论】:

【参考方案1】:

关于库,我在项目中经常看到的一种方法是这样做:

libraryDependencies ++= 
      CrossVersion.partialVersion(scalaVersion.value) match 
        case Some((2, 12)) =>
          List("groupA" %% "libA" % "x.y.z", "groupB" %% "libB" % "x.y.z")
        case Some((2, 11)) =>
          List("groupA" %% "libA" % "x.y.z", ...)
        case _ =>
          Nil
      
    

应该可以转换成这样的东西以符合您的期望(未经测试):

val myVersions: Map[Int, Map[String, String]] = Map(
  11 -> Map("libA" -> "x.y.z", "libB" -> "x.y.z"),
  12 -> Map("libA" -> "x.y.z", "libB" -> "x.y.z")
)

libraryDependencies ++= 
      CrossVersion.partialVersion(scalaVersion.value) match 
        case Some((2, n)) =>
          List("groupA" %% "libA" % myVersions(n)("libA"), "groupB" %% "libB" % myVersions(n)("libB"))
        case _ =>
          Nil
      
    

显然这只是一个草稿,读者可以在上面进行迭代。


关于编译器插件,可以使用类似的方法,使用以下语法代替addCompilerPlugin(dependency)

libraryDependencies += compilerPlugin(dependency)

(来源:https://github.com/sbt/sbt/blob/2dad7ea76385261aa542b5e7410d50d19e1a496a/main/src/main/scala/sbt/Defaults.scala#L4317)

【讨论】:

有趣的方法。非常好,谢谢!

以上是关于根据 scalaVersion 设置依赖项/插件版本的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sbt-assembly 排除测试依赖项

使用 sbt-projectmatrix 创建 AutoPlugin。如何设置scalaVersion?

从 sbt 项目的安全工件下载依赖项

Hortonworks shc 未解决的依赖项

build.sbt:如何添加 spark 依赖项

RabbitMQ插件依赖项