SBT до/после перехвата для задачи

(переупорядочено из здесь)

Я пытаюсь измерить/записать время выполнения задачи.

Я просмотрел "завертывание" задачи, добавив одну задачу до и после одной задачи, но это не будет работать каждый раз, поскольку sbt гарантирует только частичный порядок.

Лучше обернуть будет что-то в этом роде:

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

Каким должен быть этот "somehowInvoke"?

Ответ 1

Измерение времени, затрачиваемого на выполнение задачи, требует поддержки от исполнителя задачи. Как вы подразумеваете, вы не можете сделать это только с помощью примитивов задач. Я нажал некоторый образец кода, который я написал некоторое время назад, в котором показана идея.

Усложнение, которое код примера не обрабатывает, состоит в том, что пользователь концептуально думает как о одной задаче (например, компилировать), может быть реализован как несколько задач, и эти тайминги должны быть объединены. Кроме того, задача типа internalDependencyClasspath "вызывает" другие задачи (flatMap), и поэтому время ее выполнения включает время выполнения "вызываемых" задач.

EDIT: это было реализовано для 0.13.0 в качестве экспериментальной функции в 602c1759a1885 и 1cc2f57e158389759. Интерфейс ExecuteProgress предоставляет достаточную информацию о том, что ранее описанные проблемы не являются проблемой.