在sbt中,如果我在mapR
任务上使用compile
,我可以获得一个Analysis
对象,让我收集警告和其他信息。这允许我以编程方式跟踪项目特定的警告统计信息。
但是,我使用sbt的聚合功能在根项目下聚合了许多子项目。是否有一种惯用的方法将这些信息(或任意信息)聚合到这样的聚合树上?例如,如果我想知道整个构建中警告的总数,我该怎么做?我可以在我的sbt项目中维护全局Scala级别的状态,并在每个项目的AtomicInteger
步骤之后添加到compile
,但这感觉很难看,我觉得必须有更好的方法。
对于上下文,我想告诉TeamCity构建中警告的总数,因此我需要能够聚合这样的信息。
答案 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来执行此操作:
在这种情况下,它看起来像:
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
)