获取当前sbt插件交叉版本:0.13与1.1跨构建依赖配置问题
解决sbt插件交叉构建时获取目标sbt版本的问题
我之前在做sbt插件跨0.13和1.x版本构建时,也碰到过一模一样的问题——普通的sbtVersion.value总是返回当前构建环境的版本,根本拿不到目标要兼容的sbt版本。后来摸索出几个靠谱的方法,分享给你:
核心方法:使用pluginCrossBuild作用域下的sbtVersion
这是最直接的方式,sbtVersion in pluginCrossBuild会返回当前交叉构建目标的sbt版本,而不是构建环境的版本。你可以在设置依赖时根据这个值做分支判断:
// 先确保启用交叉构建 crossSbtVersions := Seq("0.13.16", "1.1.6") libraryDependencies ++= { val targetSbtVersion = (sbtVersion in pluginCrossBuild).value targetSbtVersion match { case v if v.startsWith("0.13") => // sbt 0.13专属依赖 Seq( "org.scala-sbt" % "scripted-sbt" % v % "test", "com.your.dep" % "dep-013" % "0.3.0" ) case v if v.startsWith("1.") => // sbt 1.x专属依赖 Seq( "org.scala-sbt" % "scripted-sbt" % v % "test", "com.your.dep" % "dep-1x" % "1.0.0" ) case _ => // 处理未知版本,避免构建失败 Nil } }
更严谨的版本判断:用CrossVersion.partialVersion
如果需要更精细的版本号解析(比如区分主版本和次版本),可以用CrossVersion.partialVersion把版本号拆成元组,这样判断更准确:
libraryDependencies ++= { CrossVersion.partialVersion((sbtVersion in pluginCrossBuild).value) match { case Some((0, 13)) => Seq("com.example" % "legacy-dep" % "0.5.0") case Some((1, minor)) if minor >= 1 => // 针对sbt 1.1及以上版本的依赖 Seq("com.example" % "modern-dep" % "1.2.0") case Some((1, _)) => // 其他sbt 1.x版本 Seq("com.example" % "modern-dep" % "1.1.0") case _ => Nil } }
为什么旧方法CrossBuilding.pluginSbtVersion没用了?
在早期的sbt交叉构建插件里,确实有CrossBuilding.pluginSbtVersion这个方法,但sbt 1.x之后把交叉构建的功能整合进了核心,不再需要额外插件,对应的API也换成了pluginCrossBuild作用域下的设置,所以旧方法就失效了。
内容的提问来源于stack exchange,提问作者tjarvstrand
相关产品推荐
相关产品推荐

