Запуск задачи sbt дважды с разными настройками - PullRequest
0 голосов
/ 27 апреля 2020

Как я могу запустить задачу дважды, первый раз с настройками, определенными в build.sbt, и второй раз с некоторыми другими настройками? Код будет примерно таким:

val childSetting = settingKey[String]("Some setting")

val childTask = taskKey[String]("Child task")

childTask := ???

val parentTask = taskKey[String]("Parent task")

parentTask := {
  val initial = childTask.value
  // Do some stuff
  // Run childTask again with different setting
  // Do other stuff
}

1 Ответ

0 голосов
/ 28 апреля 2020

sbt дедуплицирует задач, поэтому, например, при следующем определении parentTask

val childSetting = settingKey[String]("Some setting")
childSetting := "Live long and prosper"

val childTask = taskKey[String]("Child task")
childTask := {
  val x = childSetting.value
  println(x)
  x
}

val parentTask = taskKey[String]("Parent task")
parentTask := {
  val initial = childTask.value
  val another = childTask.value
  initial
}

может показаться, что мы выполняем childTask дважды в

parentTask := {
  val initial = childTask.value
  val another = childTask.value
  initial
}

однако при выполнении sbt parentTask мы видим побочный эффект println(x), выводящий

Live long and prosper

только один раз. Поэтому кажется, что мы не можем просто использовать макрос value, который является рекомендуемым способом выполнения задач. Попробуйте использовать runTask вот так

parentTask := {
  val st = state.value
  val extracted = Project.extract(st)
  val (st2, initial) = extracted.runTask(childTask, st)
  val st3 = extracted.appendWithSession(Seq(childSetting := "nuqneH"), st2)
  val (st4, another) = Project.extract(st3).runTask(childTask, st3)
  another
}

Теперь выполняйте sbt parentTask запускает println(x) побочный эффект childTask дважды, каждый раз с другим состоянием

Live long and prosper
...
nuqneH 

Однако выполняйте задачи непосредственно с runTask не рекомендуется, потому что он обходит сильные стороны sbt

При непосредственном вызове задачи завершается обход системы зависимостей, системы параллельного выполнения и т. д. c.

и может привести к условиям гонки

Будьте осторожны с runTask. Он выполняется вне графа задач sbt. Может привести к условиям гонки, и т. Д. c. См. Sbt / sbt # 2970

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

commands += Command.command("foo") { state =>
  "childTask" :: """set childSetting := "nuqneH"""" :: "childTask" :: state
}

при выполнении sbt foo выводит

Live long and prosper
...
nuqneH  

, где мы видим println(x) побочный эффект childTask, выполненный дважды.

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