Запуск пользовательской задачи автоматически до/после стандартной задачи

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

Итак, я хочу определить пользовательскую задачу (скажем подготовить-приложение) и ввести ее в дерево зависимостей существующих задач (например, package-bin), чтобы каждый раз, когда кто-то вызывает пакет-bin, мои пользовательские задачи запускаются прямо перед ним.

Я пробовал делать это

  def mySettings = {
    inConfig(Compile)(Seq(prepareAppTask <<= packageBin in Compile map { (pkg: File) =>
      // fiddle with the /target folder before package-bin makes it into a jar
    })) ++
    Seq(name := "my project", version := "1.0")
  }

  lazy val prepareAppTask = TaskKey[Unit]("prepare-app")

но он не выполняется автоматически package-bin прямо перед тем, как он упаковывает компиляцию в банку. Итак, как мне изменить приведенный выше код для запуска в нужное время?

В более общем плане, где я могу найти информацию о подключении к другим задачам, например компиляции, и существует ли общий способ гарантировать, что ваши собственные задачи выполняются до и после вызова стандартных задач?

Ответ 1

Расширение существующей задачи документируется документацией SBT для Tasks (смотрите раздел Изменение существующей задачи).

Что-то вроде этого:

compile in Compile <<= (compile in Compile) map { _ => 
  // what you want to happen after compile goes here 
}

Собственно, есть другой способ: определить свою задачу, зависящую от компиляции

prepareAppTask := (whatever you want to do) dependsOn compile

а затем изменить packageBin, чтобы зависеть от этого:

packageBin <<= packageBin dependsOn prepareAppTask

(все вышеперечисленные не проверены, но общая нагрузка должна работать, я надеюсь).