SBT до / после хуков для задачи
(сохранил отсюда)
Я пытаюсь измерить / записать время выполнения задачи.
Я рассмотрел "обертывание" задачи, добавив одну задачу до и одну задачу после, но это не будет работать каждый раз, так как sbt гарантирует только частичный порядок.
Лучшая упаковка будет выглядеть примерно так:
wrappedTask := {
startMeasuringTime()
somehowInvoke(myTaskKey in SomeContext)
endMeasuringTime()
}
Каким должен быть этот "каким-то образом" вызов?
1 ответ
Измерение времени, затраченного на задачу, нуждается в поддержке со стороны исполнителя задачи. Как вы подразумеваете, вы не можете сделать это только с помощью примитивов задачи. Я отправил некоторый пример кода, который я написал некоторое время назад, который показывает идею.
Сложность, с которой примерный код не обрабатывает, состоит в том, что то, что пользователь концептуально рассматривает как одну задачу (например, компиляцию), может фактически быть реализовано как несколько задач, и эти временные параметры должны быть объединены. Кроме того, такая задача, как internalDependencyClasspath
"вызывает" другие задачи (flatMap), поэтому время его выполнения включает в себя время выполнения "вызываемых" задач.
РЕДАКТИРОВАТЬ: Это было реализовано для 0.13.0 в качестве экспериментальной функции в 602c1759a1885 и 1cc2f57e158389759. Интерфейс ExecuteProgress предоставляет достаточную информацию, чтобы описанные выше проблемы не являлись проблемой.