SBT插件跨版本(0.13.x/1.x)发布失效问题求助
解决SBT插件跨0.13.x/1.x版本发布的问题
看起来你已经找对了方向,但跨版本发布失败通常是Scala版本绑定、配置冲突或者API适配的问题,我帮你梳理下关键修复点,再给你完整的可运行配置:
核心问题分析
SBT 0.13.x和1.x的底层Scala版本是绑定死的:
- SBT 0.13.x 只能用 Scala 2.10
- SBT 1.x 只能用 Scala 2.12(1.3+支持2.13,但你指定的1.0.0还是用2.12)
你原来的配置只指定了scalaVersion := "2.12.4",这会导致编译SBT 0.13版本时直接失败,因为0.13不支持Scala 2.12。
修正后的完整build.sbt
lazy val foo = (project in file(".")).settings( name := "foo", sbtPlugin := true, organization := "com.bar", version := "1.0.0", // 配置跨SBT版本 crossSbtVersions := Seq("0.13.17", "1.0.0"), // 对应SBT版本绑定的Scala版本 crossScalaVersions := Seq("2.10.7", "2.12.17"), // 动态设置默认Scala版本(和第一个crossSbtVersion匹配) scalaVersion := (crossSbtVersions.value.head match { case v if v.startsWith("0.13") => "2.10.7" case _ => "2.12.17" }), // 你的依赖(typesafe config是通用的,无需特殊处理) libraryDependencies ++= Seq( "com.typesafe" % "config" % "1.3.3" ), // 可选:如果要写插件测试,添加scripted依赖(标记为Provided,避免打包进去) libraryDependencies += { "org.scala-sbt" % "scripted-plugin" % sbtVersion.value % Provided }, // 发布配置:生成兼容Maven/SBT的构件 publishMavenStyle := true, // 替换成你的实际发布仓库,这里用本地目录做示例 publishTo := Some(Resolver.file("Local Repository", file("target/repo"))) )
关键配置说明
- crossScalaVersions:必须严格对应SBT版本的Scala,不能随便指定,否则编译会报错。
- scalaVersion动态绑定:确保默认编译环境和你指定的第一个SBT版本匹配,避免本地开发时混淆。
- scripted-plugin依赖:如果需要为插件编写集成测试(比如用SBT的scripted框架),这个依赖是必须的,
% Provided表示由SBT运行时提供,不会打包到插件JAR里。
测试与发布命令
- 编译所有跨版本:
sbt +compile - 发布所有跨版本:
sbt +publish - 单独编译某个版本:比如
sbtsbt-0.13.17 compile(注意是sbtsbt开头,不是sbt)
代码层面的API兼容提示
如果你的插件代码里用到了SBT的核心API,要注意两个版本的差异:
- 比如SBT 1.x里的
AutoPluginAPI更严谨,0.13的部分旧API已被废弃 - 可以用条件编译适配差异,示例:
import sbt._ import Keys._ object FooPlugin extends AutoPlugin { override def trigger = allRequirements override def projectSettings = Seq( scalacOptions ++= { // 根据SBT版本添加不同的编译选项 if (sbtVersion.value.startsWith("0.13")) Seq("-deprecation") else Seq("-deprecation", "-Xlint:unused") } ) }
按照这个配置调整后,跨版本发布应该就能正常工作了,如果还有具体的报错信息,可以再补充细节~
内容的提问来源于stack exchange,提问作者Knows Not Much




