如何将 sbt-protoc 和 scalapb 与 sbt cross build 集成?

How to integrate sbt-protoc and scalapb with sbt cross build?

我有一个库需要两个不同版本的 "com.thesamet.scalapb" %% "compilerplugin",具体取决于 Scala 版本。

在我的project/scalapb.sbt中我有这个代码:

def scalapbVersion(version:String): String =
  if(version == "2.11") {
    println(s">>>>>>>> Using 0.9.7 to fix 2.11 compat. ${version}")
    "0.9.7"
  } else {
    println(s">>>>>>>> Using last version. ${version}")
    "0.10.2"
  }

libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % scalapbVersion(scalaBinaryVersion.value)

执行 sbt clean "++2.11.12 compile 我得到 >>>>>>>> Using lastest version. 2.12 但在日志中,我还可以看到交叉构建插件在上一条消息后将版本更改为 Scala 2.11:

[info] Setting Scala version to 2.11.12 on 13 projects.
[info] Excluded 1 projects, run ++ 2.11.12 -v for more details.

所以我假设顺序是:

  1. sbt 使用默认的 Scala 版本加载插件配置。
  2. cross-build 更改 scala 版本

如何将 sbt-protoc 与 sbt cross-build 集成?

目录中的 project sbt 文件在选择特定的 Scala 版本进行交叉构建之前进行评估。这就是为什么在 project/scalapb.sbt.

的上下文中传递 ++2.11.12scalaBinaryVersion 没有影响

目前官方不支持在单个构建中使用不同版本的 compilerplugin,但您可以尝试一些解决方法:

  1. 下载 scalapbc 您想要使用的 ScalaPB 版本。使用 ScalaPBC 编写一个生成源代码的 shell 脚本。将生成的源签入您的代码存储库。手动添加 scalapb-runtime 到你的 libraryDependencies in build.sbt:
libraryDependencies += "com.thesamet.scalapb" %% "scalapb-runtime" % (if (scalaVersion.value == "2.12.10") "0.10.8" else "0.9.7")
  1. 对所有 Scala 版本使用 0.9.7。

  2. 如果您的情况合理,请考虑放弃对 Scala 2.11 的支持,因为几年前 Scala 2.11 已达到 end-of-life。