绘制sbt的增量编译逻辑

时间:2013-06-21 17:00:20

标签: scala sbt

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

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

这些都可行吗?我并不反对写sbt插件,但会欣赏有关如何继续的提示。

编辑:看起来Relation的{​​{1}}可能很有希望。这是否捕获了所有sbt的依赖性知识?

编辑2:更有希望的是,sbt源代码树中有一个usesInternalSrc(dep: File): Set[File]对象。它没有文档,谷歌没有任何人类可读的文字。如果我能弄清楚如何使用它,我会发一个答案。

1 个答案:

答案 0 :(得分:3)

示例console-project会话:

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

source-graph是一个包含两个点文件的目录,一个包含源依赖项,另一个包含二进制文件。您也可以直接与问题中建议的类型Relationsa.relations进行交互,并且可以捕获所有sbt的依赖性知识。在0.13中,还将提供有关从其他源文件中的某些内容继承的依赖关系的信息。

就修改源文件如何影响失效而言,它非常粗糙。对任何非私有签名的任何更改都会将源标记为已更改。在0.12及更早版本中,这至少会使直接依赖性无效,甚至更多。在0.13中,这将仅使直接依赖项无效,但继承的依赖项除外,它们是传递无效的。当修改源文件的非私有API时,目前无法查看将失效的内容。