如何根据活动的 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 或更高版本(因为这是根据
引入 VersionNumber
和 SemanticSelector
的版本
用例:我希望能够显示我的 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 或更高版本(因为这是根据
引入VersionNumber
和 SemanticSelector
的版本