SBT применяет задачу после компиляции - программирование
Подтвердить что ты не робот

SBT применяет задачу после компиляции

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

compile in Compile <<= (compile in Compile).dependsOn(myTask)

Как сделать то же самое, но после компиляции?

Я знаю, что могу:

compile in Compile <<= (compile in Compile) map{x=>
  // post-compile work
  doFoo()
  x
}

выполнить произвольный код Scala, но мне нужно автоматически выполнить целевую задачу при возникновении события компиляции

Выполнение чего-то вроде:

val foo = TaskKey[Unit]("foo", "...")
val fooTask = foo <<= scalaInstance map {si =>
...
} dependsOn(compile in Compile)

работает, если я набираю "foo" из sbt > prompt; то есть задача выполняется после компиляции, но цель состоит в том, чтобы зацепиться за компиляцию самой задачи, поэтому в любой момент компиляции задача foo автоматически вызывается после завершения компиляции.

Возможно ли это, или я не ошибаюсь, чтобы подключиться к встроенной компилируемой задаче?

4b9b3361

Ответ 1

В общем, есть какая-то задача, которая зависит от вашей задачи.

Если compile используется для обозначения "скомпилировать и настроить вещи для Grunt", тогда создайте задачу prepareGrunt, которая зависит от compile и myTask, и запустите ее вместо этого.

Если myTask должен выполняться до того, как классы проекта и ресурсы будут использованы чем-то другим, сделайте его зависимым от exportedProducts. Задачи типа run и test и задачи в зависимых проектах получат экспортированные записи пути к классам из этой задачи.

Опасность в "запуске после компиляции" заключается в том, что myTask не будет выполняться перед задачей, которая на самом деле нуждается в ней. Существует метод triggeredBy на Initialize[Task[T]], но он легко злоупотребляется и должен использоваться только тогда, когда известно, что вывод задачи используется только после выполнения всех задач.