Scala 构建ZIO和http4s应用程序,与sbt配合使用,与Bazel配合使用失败:缺少隐式

Scala 构建ZIO和http4s应用程序,与sbt配合使用,与Bazel配合使用失败:缺少隐式,scala,bazel,fs2,http4s,zio,Scala,Bazel,Fs2,Http4s,Zio,我正在尝试建立一个集成ZIO和http4s的服务 起点是(它使用zio 1.0.1、http4s 0.21.3、scala 2.12.11) 我能够使用sbt构建下面的代码,但在尝试使用Bazel构建时遇到了问题: [Error] analytics/test-endpoint/Hello1.scala:20 could not find implicit value for parameter compiler: fs2.Stream.Compiler[[x]zio.ZIO[Any,Throw

我正在尝试建立一个集成ZIO和http4s的服务

起点是(它使用zio 1.0.1、http4s 0.21.3、scala 2.12.11)

我能够使用
sbt
构建下面的代码,但在尝试使用Bazel构建时遇到了问题:

[Error] analytics/test-endpoint/Hello1.scala:20 could not find implicit value for parameter compiler: fs2.Stream.Compiler[[x]zio.ZIO[Any,Throwable,x],G]
import org.http4s.HttpRoutes
导入org.http4s.dsl.Http4sDsl
导入org.http4s.implicits_
导入org.http4s.server.blaze_
进口zio_
导入zio.interop.catz_
导入zio.interop.catz.implicits_
对象Hello1扩展应用程序{
val服务器:ZIO[ZEnv,Throwable,Unit]=ZIO.runtime[ZEnv]
.平面图{
隐式rts=>
BlazeServerBuilder[任务]
.bindHttp(8080,“本地主机”)
.使用HttpApp(Hello1Service.service)
.发球
.编译
排水
}
def运行(参数:列表[字符串])=
server.exitCode
}
Sbt很高兴,但当我用Bazel构建这个时:

[Error] analytics/test-endpoint/Hello1.scala:20 could not find implicit value for parameter compiler: fs2.Stream.Compiler[[x]zio.ZIO[Any,Throwable,x],G]
关于bazel设置:我使用的是来自的
rules\u scala
和一个
BUILD
文件,看起来像:

scala_binary(
    name = "endpoint-bin",
    srcs = ["Hello1.scala", "Hello1Service.scala"],
    deps = [
        "//3rdparty/jvm/default/org/http4s:http4s_dsl",
        "//3rdparty/jvm/default/org/http4s:http4s_blaze_server",
        "//3rdparty/jvm/default/dev/zio:zio",
        "//3rdparty/jvm/default/dev/zio:zio_interop_cats",
        "//3rdparty/jvm/default/org/typelevel:cats_effect",
    ],
)
当涉及到隐式的时候,我并没有太多的知识,我想知道“魔法酱汁”的哪一部分在Bazel中没有发挥作用。到目前为止,我有两个假设:

  • 我遗漏了一个需要在某处明确指定的依赖项,当使用sbt构建时,它位于类路径上,而在Bazel中遗漏了它
  • 这一切都取决于宏,我知道在我的设置中可能会有问题

因此,我有一个基本的问题:有没有人能解释一下让编译器在上面的示例代码中找到要传递给
compile
的正确隐式表达式的神奇之处?

-Ypartial unifications
添加到
scalacOptions
。一般来说,在Cats、Scalaz、ZIO和类型级别的重代码中,缺少此标志是主要的问题。或者,如果可以的话,迁移到2.13,其中此标志的行为被更改为始终打开(并且标志本身被删除)。

列出两种设置中的库、编译器标志和编译器插件,并对它们进行比较。由于它是2.12版本,可能会像缺少
-Ypartial unification
一样愚蠢。在看了几分钟如何列出Bazel传递的scalac选项后,我尝试将
scalacoptions=“-Ypartial unification”
添加到规则中,然后。。。。成功了。谢谢。如果你把这个写进一个答案,我会非常乐意接受。谢谢你这个意想不到的答案。不幸的是,Bazel上的scala生态系统尚未完全为2.13做好准备:(。如果你自己还没有将此标志添加到sbt中,我猜这是一些sbt插件,如sbt TPOLECT。这就是为什么我建议查看这些标志-它们可以改变行为,但可能不是你个人添加的。然后事情就变得混乱了。