如何根据活动的 sbt 版本有条件地添加 sbt 插件?

How can I conditionally add an sbt plugin, depending on the active sbt version?

用例:我希望能够显示我的 sbt 项目的依赖关系树,所以我将 addDependencyTreePlugin 添加到我的 ~/.sbt/1.0/plugins.sbt,以使其在我的机器上全局可用。

但是,该插件仅在 sbt 1 之后可用。4.x(不确定确切的版本)。

问题:每当我尝试构建 sbt.version=1.3.x 或更低 build.properties 的项目时,它都会失败。

有没有办法根据构建过程使用的 'current' 版本的 sbt 有条件地执行 addDependencyTreePlugin

这不起作用:

addDependencyTreePlugin.filter(es => sbtVersion.value.startsWith("1.5")

sbt 会抱怨:

.../plugins.sbt:4: error: `value` can only be used within a task or setting macro, such as :=, +=, ++=, Def.task, or Def.setting.
addDependencyTreePlugin.filter(es => sbtVersion.value.startsWith("1.5"))
^

SBT addDependencyTreePlugin定义如下:

def addDependencyTreePlugin: Setting[Seq[ModuleID]] =
    libraryDependencies += sbtPluginExtra(
      ModuleID("org.scala-sbt", "sbt-dependency-tree", sbtVersion.value),
      sbtBinaryVersion.value,
      scalaBinaryVersion.value
    )

要应用条件逻辑,您必须使用如下内容:

def addDependencyTreePluginCustom: Setting[Seq[ModuleID]] =
    libraryDependencies ++= if (condition) Seq(sbtPluginExtra(
      ModuleID("org.scala-sbt", "sbt-dependency-tree", sbtVersion.value),
      sbtBinaryVersion.value,
      scalaBinaryVersion.value
    )) else Seq()

注意:可能存在更简单的方法

在@Gaël 的帮助下,我想出了:

libraryDependencies ++= (if (VersionNumber(sbtVersion.value).matchesSemVer(SemanticSelector(">=1.4"))) {
                           println(s"Adding dependency tree plugin, sbt version is ${sbtVersion.value}")
                           Seq(
                             sbtPluginExtra(
                               ModuleID("org.scala-sbt", "sbt-dependency-tree", sbtVersion.value),
                               sbtBinaryVersion.value,
                               scalaBinaryVersion.value
                             )
                           )
                         } else Seq[ModuleID]())
}

只要 sbt 版本是 1.2 或更高版本(因为这是根据

引入 VersionNumberSemanticSelector 的版本