根据 scalaVersion 设置依赖项/插件版本
Set Dependencies / Plugins versions depending on scalaVersion
我正在尝试为 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 获得正确的依赖版本?
关于库,我在项目中经常看到的一种做法是这样的:
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
}
}
显然这只是 reader 可以迭代的草稿。
关于编译器插件,可以通过使用以下语法替代 addCompilerPlugin(dependency)
来使用类似的方法:
libraryDependencies += compilerPlugin(dependency)
我正在尝试为 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 获得正确的依赖版本?
关于库,我在项目中经常看到的一种做法是这样的:
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
}
}
显然这只是 reader 可以迭代的草稿。
关于编译器插件,可以通过使用以下语法替代 addCompilerPlugin(dependency)
来使用类似的方法:
libraryDependencies += compilerPlugin(dependency)