【问题标题】:How can I conditionally add an sbt plugin, depending on the active sbt version?如何根据活动的 sbt 版本有条件地添加 sbt 插件?
【发布时间】:2022-01-13 14:21:38
【问题描述】:

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

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

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

有没有办法根据构建过程使用的“当前”版本的 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 兼容回 1.0。
  • 我很乐意,但企业环境发展缓慢,因此并非所有项目都可以一直更新。此外,在回顾旧分支时,我有时希望能够使用旧版本重现构建。

标签: scala sbt sbt-plugin


【解决方案1】:

SBTaddDependencyTreePlugin定义如下:

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()

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

【讨论】:

  • 我必须在 if 语句 ((if (...)...else Seq())) 周围添加括号,但这样就可以了。谢谢。
【解决方案2】:

在@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 对应 https://stackoverflow.com/a/56587048/2037054

【讨论】:

    猜你喜欢
    • 2015-02-07
    • 1970-01-01
    • 2016-07-27
    • 2018-05-10
    • 2012-01-24
    • 1970-01-01
    • 2012-08-11
    • 2013-01-19
    • 2013-03-22
    相关资源
    最近更新 更多