Как генерировать ресурсы для задачи?
Для меня 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.