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 автоматически вызывается после завершения компиляции.
Возможно ли это, или я не ошибаюсь, чтобы подключиться к встроенной компилируемой задаче?
Ответы
Ответ 1
В общем, есть какая-то задача, которая зависит от вашей задачи.
Если compile
используется для обозначения "скомпилировать и настроить вещи для Grunt", тогда создайте задачу prepareGrunt
, которая зависит от compile
и myTask
, и запустите ее вместо этого.
Если myTask
должен выполняться до того, как классы проекта и ресурсы будут использованы чем-то другим, сделайте его зависимым от exportedProducts
. Задачи типа run
и test
и задачи в зависимых проектах получат экспортированные записи пути к классам из этой задачи.
Опасность в "запуске после компиляции" заключается в том, что myTask
не будет выполняться перед задачей, которая на самом деле нуждается в ней. Существует метод triggeredBy
на Initialize[Task[T]]
, но он легко злоупотребляется и должен использоваться только тогда, когда известно, что вывод задачи используется только после выполнения всех задач.