汇总对sbt子项目的分析

时间:2013-04-18 20:54:48

标签: scala sbt

在sbt中,如果我在mapR任务上使用compile,我可以获得一个Analysis对象,让我收集警告和其他信息。这允许我以编程方式跟踪项目特定的警告统计信息。

但是,我使用sbt的聚合功能在根项目下聚合了许多子项目。是否有一种惯用的方法将这些信息(或任意信息)聚合到这样的聚合树上?例如,如果我想知道整个构建中警告的总数,我该怎么做?我可以在我的sbt项目中维护全局Scala级别的状态,并在每个项目的AtomicInteger步骤之后添加到compile,但这感觉很难看,我觉得必须有更好的方法。

对于上下文,我想告诉TeamCity构建中警告的总数,因此我需要能够聚合这样的信息。

1 个答案:

答案 0 :(得分:2)

有一种直接的方式特定于获取Analysis,但前提是您需要的所有Analysis值都在类路径上。 在sbt中,类路径的类型为Seq[Attributed[File]]Attributed部分将元数据附加到每个条目。 一条元数据是该条目的Analysis(显然只有从源代码编译它)。

因此,这将为类路径获得Seq[Analysis]

... (fullClasspath in Compile) map { (cp: Seq[Attributed[File]]) =>
   cp.map(entry => Defaults.extractAnalysis(entry)._2)
}

请注意,Defaults.extractAnalysis的{​​{3}}如果没有附加,则会Analysis为空。


在0.13中,最终通常会有一个API来执行此操作:

implementation

在这种情况下,它看起来像:

someTask := {
   val allA: Seq[inc.Analysis] = compile.result.all(
      ScopeFilter( inAggregates(ThisProject), inConfigurations(Compile) )
   ).value
   ...
}

result部分与直接语法中的mapR相同: http://www.scala-sbt.org/snapshot/docs/Detailed-Topics/Tasks.html#multiple-scopes