我遇到了一个意想不到的(只为我自己?)ScalaC行为。
下面是我在尝试将代码库从maven迁移到bazel时看到的一个问题的再现。此迁移的主要焦点之一是尝试最小化每个类在编译时所需的依赖性,以便只有在需要时才会触发构建。
不幸的是,我看到的是,给定ClassIndirectlyNeedingFoo(uses)->ClassUsingFoo(uses)->Supplier,如果Supplier不在类路径上,ClassIndirectlyNeedingFoo的编译就会中断。完整的细节在这里(https://github.com/ittaiz/scalac-troubleshooting)。
如果有人知道scalac为什么会这样,我会非常感激。
谢谢!
顺便说一句,供应商不在ClassIndirectlyNeedingFoo的源代码或字节码中...
发布于 2017-01-16 04:44:24
好的,所以简短的答案是Why对anyone来说并不是完全清楚的(参见#4)。很清楚的是,众所周知,scalac有时需要比人们想象的更多的依赖项,而且很明显,当这种情况发生时,它是一个bug。
此外,从与Jason Zaugg在Gitter上的讨论中,他似乎认为我的上述问题只是像上面链接的错误家族的一部分。
正如赛斯在评论中所链接的那样,ScalaCenter已经接受了一个proposal (original PR)来澄清这一领域。
与这个问题最相关的是那里的四个建议:
Statement为中心:它们是预期的常见情况,而不是导致存根错误的案例数量的罕见、意外或致命的情况...即,允许更多当前导致存根错误的用例成功编译,从而允许更少的直接dependencies.import语句。对于-Ywarn-unused-imports的对称性,此选项可能称为-Ywarn-undeclared-imports。它将主要帮助进行从可传递到直接依赖的转换,而不是帮助维护已经使用直接依赖的构建。(正如@posco和Scala语言规范的@adriaanm)等
虽然我不知道这项工作什么时候会开始,但继续进行#3是agreed的。
Eugeene Burmako是该提案的合著者之一,他开始制作solution的原型,我在此基础上制作了一个小型change。
现在,这将解决我的问题。
https://stackoverflow.com/questions/41600346
复制相似问题