1

sbt ではmapRcompileタスクでを使用すると、Analysis警告やその他の情報を収集できるオブジェクトを取得できます。これにより、プロジェクト固有の警告統計をプログラムで追跡できます。

ただし、sbt の集約機能を使用して、ルート プロジェクトの下に集約された多くのサブプロジェクトがあります。この情報 (または任意の情報) をこのような集約ツリーに集約する慣用的な方法はありますか? たとえば、ビルド全体での警告の総数を知りたい場合、どうすればよいでしょうか? sbt プロジェクト内でグローバルな Scala レベルの状態を維持し、AtomicInteger各プロジェクトのcompileステップの後に追加することはできますが、それは見苦しく、もっと良い方法があるに違いないと感じています。

コンテキストとして、ビルド内の警告の総数を TeamCity に伝えたいので、このような情報を集約できる必要があります。

4

1 に答える 1

2

分析の取得に固有の簡単な方法がありますが、必要なすべてのAnalysis値がクラスパス上にある場合のみです。sbt では、クラスパスの型はSeq[Attributed[File]]. 属性部分は、各エントリにメタデータを添付します。メタデータの 1 つは、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 に答える