You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法为多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

关键说明

  1. crossSbtVersions的作用:这个配置告诉sbt你要为哪些sbt版本编译插件,每个sbt版本会自动匹配固定的Scala版本(比如0.13.17对应Scala 2.10,1.0.0对应Scala 2.12)。
  2. +符号的意义:在sbt命令前加+,表示要针对所有crossSbtVersions中指定的版本执行后续命令(这里就是publishLocal)。
  3. 关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:29:23