绘制sbt的增量编译逻辑

Mys*_*Dan 5 scala sbt

sbt 维护任务之间的依赖关系,并且可以相当容易地推理结果图。另一方面,浏览源代码,增量编译逻辑似乎更加不透明。我希望能够做以下事情:

  • 相当于“如果我[以这种方式]修改了这个接口,什么会变得无效?”
  • 构建一个图表,说明修改不同的类接口如何影响构建的其余部分。考虑到 Scala 中隐式依赖关系的复杂程度,绘制 scala 导入依赖关系图并不是一个特别好的近似方法。似乎 sbt 必须以某种形式维护这些信息才能进行增量编译,所以我“只是”需要弄清楚如何访问它,并希望它的形式适合我的用例。

其中任何一个可行吗?我并不反对编写 sbt 插件,但希望得到有关如何继续的提示。

编辑:看起来Relation很有usesInternalSrc(dep: File): Set[File]希望。这是否捕获了 sbt 的所有依赖知识?

编辑2:更有希望的是,DotGraphsbt 源代码树中有一个对象。它没有文档,谷歌也没有任何关于它的人类可读的文本。如果我能弄清楚如何使用它,我会发布答案。

Mar*_*rah 3

会话console-project示例:

> val (s, a) = runTask(compile in Compile, currentState)
> DotGraph.sources(a.relations, file("source-graph"), Nil)
Run Code Online (Sandbox Code Playgroud)

source-graph是一个包含两个点文件的目录,一个具有源依赖项,一个具有二进制文件。您也可以直接与Relationsa.relations类型交互,如问题中所建议的那样,它确实捕获了 sbt 的所有依赖知识。在 0.13 中,还将提供有关哪些依赖项是由于从另一个源文件中的某些内容继承而产生的信息。

就修改源文件如何影响失效而言,它的粒度非常粗。对任何非私有签名的任何更改都会将源标记为已更改。在 0.12 及更早版本中,这至少会使直接依赖项无效,甚至可能更多。在 0.13 中,这只会使直接依赖项失效,继承的依赖项除外,继承的依赖项会传递失效。目前没有办法知道当源文件的非私有 API 被修改时,哪些内容将会失效,除非这样做。