对于我的Runtime
配置,我可以按如下方式定义额外的resourceGenerator
:
resourceGenerators in Runtime <+= myResourceGeneratingTask
对于assembly
任务,这不起作用:
resourceGenerators in assembly <+= myResourceGeneratingTask
错误消息是:
Reference to undefined setting:
*:assembly::resourceGenerators from *:assembly::resourceGenerators (...\build.sbt:20)
当我更改&#39;追加&#39;运算符<+=
到赋值<<=
,它不再导致任何错误,但我的资源生成器未被调用。
答案 0 :(得分:3)
请注意,我使用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
而不是通常的值。它应该是 根据生成的文件是否为main(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.