带有 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.8
(compilerplugin
版本用于主要依赖 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 版本。
有没有人有一个简单的 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.8
(compilerplugin
版本用于主要依赖 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 版本。