Запускать пользовательское задание автоматически до / после стандартного задания - PullRequest
33 голосов
/ 19 октября 2011

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

Итак, я хочу определить пользовательскую задачу (скажем, prepare-app ) и добавить ее в дерево зависимостей существующих задач (скажем, package-bin ).так что каждый раз, когда кто-то вызывает package-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 не выполняет его автоматически перед упаковкой вывода компиляции в jar.Итак, как мне изменить приведенный выше код для запуска в нужное время?

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

Ответы [ 2 ]

34 голосов
/ 19 октября 2011

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

Примерно так:

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

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

0 голосов
/ 22 марта 2019

Как обновление к предыдущему ответу @Paul Butcher, это может быть сделано несколько иначе в версиях SBT 1.x, так как <<== больше не поддерживается.Я взял пример примера задачи, выполняемой перед компиляцией, которую я использую в одном из моих проектов:

lazy val wsdlImport = TaskKey[Unit]("wsdlImport", "Generates Java classes from WSDL")

wsdlImport := {
  import sys.process._
  "./wsdl/bin/wsdl_import.sh" !
  // or do whatever stuff you need
}

(compile in Compile) := ((compile in Compile) dependsOn wsdlImport).value

Это очень похоже на то, как это было сделано до 1.x.

Также есть еще один способ, предложенный официальными документами SBT , который в основном представляет собой набор задач (вместо иерархии зависимостей).Возьмем тот же пример, что и выше:

(compile in Compile) := {
  val w = wsdlImport.value
  val c = (compile in Compile).value
  // you can add more tasks to composition or perform some actions with them
  c
}

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

Протестировано на SBT 1.2.3, но должен работать и с другими 1.x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...