0

有没有人有一个简单的 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

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

4

2 回答 2

0

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.8compilerpluginscalapb-runtime-grpc

对于第 3 次,不幸的是,它还没有为 Scala 3 发布。一种尝试是在build.sbt_2.13中使用类似的东西来强制这个版本的版本:

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 版本的可用库版本:

于 2022-01-11T08:05:44.557 回答
0

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

于 2022-01-11T19:19:01.037 回答