【问题标题】:SBT before/after hooks for a task任务的 SBT 之前/之后挂钩
【发布时间】:2012-09-03 20:49:35
【问题描述】:

(转自here

我正在尝试测量/记录任务的运行时间。

我已经研究过通过在之前添加一个任务和之后添加一个任务来“包装”一个任务,但这不会每次都有效,因为 sbt 只能保证部分顺序。

更好的包装应该是这样的:

wrappedTask := {
  startMeasuringTime()
  somehowInvoke(myTaskKey in SomeContext)
  endMeasuringTime()
}

这个“somehowInvoke”应该是什么?

【问题讨论】:

  • 哪个版本的 SBT? SBT 在 0.7.x 版本之后发生了很大变化

标签: scala sbt


【解决方案1】:

测量任务所花费的时间需要任务执行者的支持。 正如您所暗示的,您不能仅通过使用任务原语来做到这一点。 我已经推送了一些 sample code,这是我不久前写的,显示了这个想法。

示例代码无法处理的一个复杂情况是,用户在概念上认为是一个任务(例如编译)实际上可能被实现为多个任务,并且需要组合这些时间。此外,像internalDependencyClasspath 这样的任务“调用”其他任务(flatMap),因此其执行时间包括“被调用”任务的执行时间。

编辑:这是在 0.13.0 中实现的,作为 602c1759a18851cc2f57e158389759 中的实验性功能。 ExecuteProgress 接口提供了足够的信息,表明上述问题不是问题。

【讨论】:

  • 谢谢!由于我只需要测量运行时间,因此我最终制作了一个包装 ScalaRun 运行的任务。
  • ExecuteProgress 看起来很整洁。是否可以从 sbt 的“外部”指定一个?
  • 不知道你说的外面是什么意思。虽然没有实现,但您可能会像 parallelExecution 或现在的 0.12、concurrentRestrictions 那样配置它。
  • 还在学习 sbt 的实现...所以,这意味着为它创建一个密钥并将EvaluateTask 修改为def progress: ExecuteProgress[Unit, Task] = getSetting(Keys.executeProgress, new ExecuteProgress [...] )
猜你喜欢
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
  • 2020-02-04
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多