1

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

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

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

4

1 回答 1

2

有一种特定于获取分析的直接方法,但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空。Analysis


在 0.13 中,终于有一个 API 可以做到这一点:

http://www.scala-sbt.org/snapshot/docs/Detailed-Topics/Tasks.html#multiple-scopes

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

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

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

于 2013-04-19T16:40:48.780 回答