为什么scalac需要对类路径的传递依赖

时间:2017-01-11 20:43:17

标签: scala dependencies scalac

我遇到意想不到的(仅限我?)ScalaC行为。
TL; DR是以下是我在尝试将代码库从maven迁移到bazel时看到的问题。此迁移的主要重点之一是尝试最小化每个类编译所需的依赖关系,以便仅在需要时触发构建。

不幸的是,我看到的是给定ClassIndirectlyNeedingFoo(使用) - > ClassUsingFoo(使用) - > Supplier如果ClassIndirectlyNeedingFoo Supplier的编译中断不在类路径上。 完整的详细信息在这里(https://github.com/ittaiz/scalac-troubleshooting) 如果有人知道scalac为什么会这样,我真的很感激 谢谢!

BTW,供应商不在ClassIndirectlyNeedingFoo的源代码或字节码中......

1 个答案:

答案 0 :(得分:2)

好的简短回答是Whyanyone并不完全清楚(见#4)。显而易见的是,scalac有时候需要的依赖性比人们想象的要多,而且很明显,有时当这种情况发生时,它是bug

此外,在Gitter与Jason Zaugg的讨论中,他似乎认为我的上述问题仅仅是上述问题的一部分。

正如Seth在评论中所链接的那样,ScalaCenter已接受proposaloriginal PR)来澄清此区域。
与此问题最相关的是那里的四个提案:

  
      
  1. 针对存根错误的用户体验的改进,以Statement为中心:它们是预期的常见情况,而不是   罕见,意外或致命的情况。
  2.   
  3. 减少导致存根错误的案例数量...即,允许更多当前导致存根错误的用例   成功编译,从而允许更少的直接依赖。
  4.   
  5. 编译器标志,要求编译期间使用的所有符号都需要import语句(包括那些在编译中未提及的符号)   资源)。对于-Ywarn-unused-imports的对称性,此选项可能   可能被称为-Ywarn-undeclared-imports。它主要是   协助从传递到直接过渡   依赖,而不是帮助维护已经构建的   使用直接依赖。 (按照建议   @posco和   @adriaanm
  6.   
  7. 扩展Scala语言规范,列出其中必须存在来自另一个编译单元的符号的所有情况   classpath,包括:1)子类化,2)返回超类的类型'   公共方法,3)直接参考,4)等。
  8.   

虽然我不知道什么时候开始工作,但是{3}才能继续#3} 共同撰写该提案的Eugeene Burmako开始对agreed进行原型设计,并在此基础上做了一个小solution
现在,这将解决我的问题。