【问题标题】:Aggregating analyses over sbt subprojects对 sbt 子项目进行汇总分析
【发布时间】:2013-04-20 00:40:48
【问题描述】:

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

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

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

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    有一种特定于获取分析的直接方法,但前提是您想要的所有 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 )

    【讨论】:

    • 这看起来很方便。现在,如果我真的很烦人,我当前使用 AtomicInteger 的解决方案能够通过在每个子项目构建时增加计数器来为 TeamCity 提供运行总计。有什么方法可以很好地做到这一点吗?
    • 我不这么认为。如果它存在,它可能是github.com/sbt/sbt/issues/592 的形式。
    猜你喜欢
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 2019-07-28
    相关资源
    最近更新 更多