首页 > 解决方案 > 如何根据 sbt 中的 crossScalaVersions 更改 unmanagedBase

问题描述

我必须根据使用的 Scala 版本使用不同的非托管 jar 文件。可以使用 built.sbt 一次完成一个 Scala 版本

val defaultScalaVersion = "2.12.4"

scalaVersion := defaultScalaVersion // because I can't figure out how to read value

val majorMinor = {
  val versionRegex = "(\\d+)\\.(\\d+)\\.(\\d+)".r
  val versionRegex(major, minor, update) = defaultScalaVersion

  major + "." + minor
}

unmanagedBase := baseDirectory.value / ("lib-" + majorMinor)

但是,如果我需要使用类似的东西发布两个不同的版本

crossScalaVersions := Seq("2.11.11", "2.12.4")

当然,我的 majorMinor 和 unmanagedBase 不会改变。这个怎么安排?

标签: sbt

解决方案


您可以阅读当前主要/次要版本的 ScalascalaBinaryVersion.value并直接使用它:

unmanagedBase := baseDirectory.value / s"lib-${scalaBinaryVersion.value}"

您还可以使用CrossVersion.partialVersion提取版本的主要/次要组件。因此,如果您想要不同格式的版本,您可以调整您当前的解决方案:

lazy val majorMinor = Def.setting {
  CrossVersion.partialVersion(scalaVersion.value) match {
    case Some((major, minor)) => s"${major}-${minor}"
  }
}

unmanagedBase := baseDirectory.value / s"lib-${majorMinor.value}"

请注意,为了能够.valuemajorMinor值定义中使用,您需要使用Def.setting宏(或者Def.task如果您指的是任务)。


推荐阅读