2013-04-18 60 views
1

在sbt中,如果我在compile任務上使用mapR,我可以得到一個Analysis對象,它可以讓我收穫警告和其他信息。這使我能夠以編程方式跟蹤項目特定的警告統計信息。sbt子項目彙總分析

但是,我有許多使用sbt的聚合功能聚合在一個根項目下的子項目。有沒有一種將這種信息(或任意信息)聚合到這種聚合樹上的習慣方式?例如,如果我想知道整個構建中的警告總數,我該怎麼做?我可以在我的sbt項目中維護全球Scala級別的狀態,並在每個項目的compile步驟後添加到AtomicInteger,但這感覺很難看,我覺得必須有更好的方法。

對於上下文,我想告訴TeamCity構建中的警告總數,所以我需要能夠像這樣聚合信息。

回答

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.extractAnalysisimplementation得到一個空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部分做與直接語法中的mapR相同: http://www.scala-sbt.org/snapshot/docs/Detailed-Topics/Tasks.html#result

+0

這看起來很方便。現在,如果我真的很想討厭,我現在使用AtomicInteger的解決方案能夠通過增加每個子項目構建的計數器來爲TeamCity提供一個運行總數。有沒有辦法很好地做到這一點? –

+0

我不這麼認爲。如果它存在的話,它可能是https://github.com/sbt/sbt/issues/592的形式。 –