无法为多Scala版本交叉发布sbt插件的技术求助
解决sbt插件无法交叉发布多个Scala版本的问题
我来帮你排查并搞定这个问题——sbt插件的交叉编译逻辑和普通Scala项目不太一样,你遇到的问题核心是没搞清楚sbt插件版本与Scala版本的绑定关系。
问题根源
当你设置sbtPlugin := true时,sbt插件的Scala版本是由它依赖的sbt版本决定的,而非你直接指定的crossScalaVersions。比如:
- sbt 1.x 系列默认绑定 Scala 2.12.x
- sbt 0.13.x 系列默认绑定 Scala 2.10.x
- sbt 1.3+ 开始支持绑定 Scala 2.13.x
你之前只配置了crossScalaVersions,但没指定要兼容的sbt版本,所以sbt只会用你当前运行的sbt版本(看起来是1.x)对应的Scala 2.12编译,自然不会生成2.11相关的文件。
解决方案
修改你的build.sbt,添加crossSbtVersions指定要支持的sbt版本(间接对应Scala版本),然后用sbt +publishLocal执行交叉发布:
lazy val root = (project in file(".")).settings( inThisBuild(List( sbtPlugin := true, organization := "com.foo", crossSbtVersions := Seq("0.13.17", "1.0.0"), // 指定要兼容的sbt版本 version := "1.0.0" )), name := "myplugin", libraryDependencies ++= Seq( "org.scala-lang.modules" %% "scala-xml" % "1.0.6", "com.typesafe" % "config" % "1.3.3" ) )
接着在命令行执行:
sbt +publishLocal
关键说明
crossSbtVersions的作用:这个配置告诉sbt你要为哪些sbt版本编译插件,每个sbt版本会自动匹配固定的Scala版本(比如0.13.17对应Scala 2.10,1.0.0对应Scala 2.12)。+符号的意义:在sbt命令前加+,表示要针对所有crossSbtVersions中指定的版本执行后续命令(这里就是publishLocal)。- 关于Scala 2.11的说明:官方sbt版本没有绑定Scala 2.11的,如果你确实需要基于Scala 2.11的插件,可能需要自定义sbt构建,但这种场景非常罕见,通常建议对应到官方sbt版本绑定的Scala版本。
执行完命令后,你就能在.ivy2/local/com.foo/myplugin下看到对应sbt_0.13和sbt_1.0的目录,里面分别是对应Scala版本的插件jar包了。
内容的提问来源于stack exchange,提问作者Knows Not Much
相关产品推荐
相关产品推荐

