带有 Scala 3 的 zio-grpc(第二次尝试)

zio-grpc with Scala 3 (2nd try)

有没有人有一个简单的 zio-grpc 服务器,项目中也有 codegen,可以使用 Scala 3?

我从他们的 repo 开始使用 HelloWorld 项目,并尝试使用 scalaVersion := "3.1.0"

构建它

这里是 plugins.sbt 中的相关部分:

libraryDependencies ++= Seq(
  "com.thesamet.scalapb.zio-grpc" % "zio-grpc-codegen_2.13" % zioGrpcVersion,
  "com.thesamet.scalapb" % "compilerplugin_2.13" % "0.11.1"
)

excludeDependencies ++= Seq(
  ExclusionRule("org.scala-lang.modules", "scala-collection-compat_2.12"),
  ExclusionRule("com.thesamet.scalapb", "protoc-bridge_2.12")
)

并在 build.sbt 中:

libraryDependencies ++= Seq(
  "io.grpc" % "grpc-netty" % grpcVersion,
  "com.thesamet.scalapb" % "scalapb-runtime-grpc_2.13" % scalapb.compiler.Version.scalapbVersion
)

excludeDependencies ++= Seq(
  ExclusionRule("org.scala-lang.modules", "scala-collection-compat_2.12"),
  ExclusionRule("com.thesamet.scalapb", "protoc-bridge_2.12")
)

由于 Scala 3 可以使用 2.13 库,这就是我正在做的。 (在三个 zio-grpc 相关的库中,一个 zio-grpc-codegen 没有 Scala 3 版本,因此至少必须使用 2.13。)

我从上面版本的 sbt 得到这个错误:

java.lang.NoSuchMethodError: scala.package$.Seq()Lscala/collection/immutable/Seq$; 在 protocbridge.gens$.java(gens.scala:17) 在 protocbridge.gens$.(gens.scala:11)

如果我删除任何一个 scala-collection-compat 排除项,我们得到

[错误] 模块在 ProjectRef(uri("file:/Users/xxx/dev/zio-grpc/examples/helloworld/project/"), "helloworld-build") 中解决了冲突的跨版本后缀: [错误] com.thesamet.scalapb:protoc-bridge _2.12, _2.13 [错误] com.thesamet.scalapb:compilerplugin _3, _2.13

简而言之,我找不到任何不会给出一些 sbt 冲突的跨版本后缀错误的 Scala 2.13/3 版本的 zio-grpc-codegen、compilerplugin_3 和 scalapb-runtime-grpc 的任何排列.

TL;DR:这还不可能,因为您正在使用的某些代码依赖于宏并且尚未针对 Scala3 发布。


无论您的项目中使用哪个 Scala 版本,SBT 插件都与 Scala 2.12 一起运行,因此您不必尝试使用带有 _2.13_3 后缀的插件,只需使用实际选择 _2.12 个工件的常规语法。

也就是在plugins.sbt:

libraryDependencies ++= Seq(
  "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion,
  "com.thesamet.scalapb" %% "compilerplugin" % "0.11.8"
)

(无需排除)

您可以通过查看 sbt 日志来确认这一点,您应该会看到它下载了 Scala 2.12 版的插件:

...
https://somerepository.com/com/thesamet/scalapb/zio-grpc/zio-grpc-codegen_2.12/0.5.1/zio-grpc-codegen_2.12-0.5.1.pom
https://somerepository.com/com/thesamet/scalapb/compilerplugin_2.12/0.11.8/compilerplugin_2.12-0.11.8.pom
...

执行此操作后,您将收到错误消息,因为以下依赖项不存在:

  • com.thesamet.scalapb:scalapb-runtime_3:0.11.1
  • com.thesamet.scalapb:scalapb-runtime-grpc_3:0.11.1
  • com.thesamet.scalapb.zio-grpc:zio-grpc-core_3:0.5.0

对于第一个和第二个,你只需要像我在上面所做的那样将 compilerplugin 版本更新为 0.11.8compilerplugin 版本用于主要依赖 scalapb-runtime-grpc).

对于第 3 次,不幸的是它还没有针对 Scala 3 发布。一种尝试是用 build.sbt:

libraryDependencies += ("com.thesamet.scalapb.zio-grpc" %% "zio-grpc-core" % "0.5.1") cross CrossVersion.for3Use2_13

excludeDependencies += "com.thesamet.scalapb.zio-grpc" % "zio-grpc-core_3"

但这不会编译,但会出现一些与宏相关的错误,这是 Scala 2.13 和 3 之间不兼容的问题。你无法解决这个问题。


请记住,您可以在 Maven 中央检查 Scala 版本的可用库版本:

我还没有为 Scala 3 发布 zio-grpc,因为一些与 Has 相关的测试失败了并且很难修复。同时,ZIO 2 即将推出并弃用 Has。即将推出支持 ZIO 2 和 Scala 3 的 zio-grpc 版本。