Как генерировать ресурсы для задачи?

Для меня Runtime Конфигурация, я могу определить дополнительный resourceGenerator следующее:

resourceGenerators in Runtime <+= myResourceGeneratingTask

Для assembly Задача это не работает:

resourceGenerators in assembly <+= myResourceGeneratingTask

Сообщение об ошибке:

Reference to undefined setting:

  *:assembly::resourceGenerators from *:assembly::resourceGenerators (...\build.sbt:20)

Когда я меняю оператор 'append' <+= к назначению <<=больше не вызывает никаких ошибок, но мой генератор ресурсов не вызывается.

1 ответ

Решение

Обратите внимание, что я использую SBT 0,13,5. Он также работает с Typesafe Activator 1.2.3 (так как он основан на sbt 0.13.5).

assembly это задача, а не конфигурация и не предлагает resourceGenerators установка и, следовательно, ошибка - undefined setting,

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

resourceGenerators in (Runtime, assembly) += myResourceGeneratingTask.taskValue

Обратите внимание, что я использую += а также taskValue комбинация, которая является предпочтительным подходом в 0,13. Я также извлек метод def makeSomeSources при необходимости использовать его в других случаях использования. Смотрите Генерация файлов в официальной документации sbt:

Поскольку мы хотим добавить задачу, а не значение после ее выполнения, мы используем taskValue вместо обычного значения. Должен быть ограничен в зависимости от того, являются ли сгенерированные файлы основными (Compile) или тест (Test) Ресурсы.

В вашем случае это для assembly задача в Runtime конфигурации.

build.sbt я использовал для справки:

import AssemblyKeys._

assemblySettings

def makeSomeSources(f: File): Seq[File] = {
  val content = "Hello"
  IO.write(f, content)
  Seq(f)
}

lazy val myResGenT = taskKey[Seq[File]]("My personal resgen")

myResGenT := {
  val log = streams.value.log
  val f = (resourceManaged in Compile).value / "resgen.xml"
  val fs: Seq[File] = makeSomeSources(f)
  log.info(s"Generating file(s): $fs")
  fs
}

resourceGenerators in Compile += myResGenT.taskValue

resourceGenerators in Runtime += myResGenT.taskValue

resourceGenerators in (Runtime, assembly) += myResGenT.taskValue

проведение runtime:assembly дает мне следующий вывод:

> runtime:assembly
[info] Generating file(s): List(C:\dev\sandbox\resourceGenerators\target\scala-2.10\resource_managed\main\resgen.xml)
[info] Including: scala-library.jar
[info] Checking every *.class/*.jar file's SHA-1.
[info] Merging files...
[warn] Merging 'META-INF\MANIFEST.MF' with strategy 'discard'
[warn] Strategy 'discard' was applied to a file
[info] SHA-1: 875d4b95f38dc85d14e53bdcd10e442520aeeefd
[info] Packaging C:\dev\sandbox\resourceGenerators\target\scala-2.10\resourcegenerators-assembly-0.1-SNAPSHOT.jar ...
[info] Done packaging.
Другие вопросы по тегам