Scala 在jar(SBT)中包含生成的资源

Scala 在jar(SBT)中包含生成的资源,scala,jar,sbt,Scala,Jar,Sbt,我一直在写一个SBT插件,它将资源生成到resource\u managed中。我现在希望在生成的jar中包含这些生成的资源,作为SBT文档的详细信息: : 默认情况下,生成的资源不包括在打包的源工件中。为此,请像添加其他映射一样添加它们。请参见向包中添加文件 我读过文件,但老实说我不知道怎么做。有谁能解释一下,或者给我指出另一个这样做的项目,让我看看他们是怎么做的吗?首先要澄清的是,它们包含在包含编译类的JAR中。它们不包括在含有来源的罐子中 默认情况下,生成的资源不包括在打包的 源工件 对于

我一直在写一个SBT插件,它将资源生成到
resource\u managed
中。我现在希望在生成的jar中包含这些生成的资源,作为SBT文档的详细信息:

:

默认情况下,生成的资源不包括在打包的源工件中。为此,请像添加其他映射一样添加它们。请参见向包中添加文件


我读过文件,但老实说我不知道怎么做。有谁能解释一下,或者给我指出另一个这样做的项目,让我看看他们是怎么做的吗?

首先要澄清的是,它们包含在包含编译类的JAR中。它们不包括在含有来源的罐子中

默认情况下,生成的资源不包括在打包的 源工件

对于
packageBin
而言,生成的文件应该已经包含在内-只需确保从generator方法返回所有生成的文件即可。假设您想将它们打包到源工件中,这就是您必须做的

假设您有一个生成属性文件的生成器

lazy val generatePropertiesTask = Def.task {
  val file = (resourceManaged in Compile).value / "stack-overflow" / "res.properties"
  val contents = s"name=${name.value}\nversion=${version.value}"
  IO.write(file, contents)
  Seq(file)
}

resourceGenerators in Compile += generatePropertiesTask.taskValue
要将其包含在生成的源中,您必须告诉sbt必须将
res.properties
复制到生成的源人工制品中的何处。生成打包源的任务称为
packageSrc
,因此必须设置映射

由于生成器可以生成许多任务,而手动映射每个任务将是一项乏味的任务,因此sbt为您提供了一种一次映射多个路径的方法

mappings in (Compile, packageSrc) ++= {
  val allGeneratedFiles = ((resourceManaged in Compile).value ** "*") filter { _.isFile }
  allGeneratedFiles.get pair relativeTo((resourceManaged in Compile).value)
}

第一行使用查找所有生成的文件,第二行将它们映射到目标jar中的路径。

那么(File,string)映射中的字符串是jar根的相对路径?好的,酷。我在github上发现了一个例子,其中一个插件使用生成器任务并将输出导入映射,例如:
Universal@MichaelAllen中的映射是的,它们是相对于jar的根的。你评论的第二部分也是正确的。你可以这样做。Sbt将在一次运行中最多评估一次任务。如果我有多个项目依赖于具有生成的资源的基本项目,则该资源将被生成多次。由于映射,它尝试将所有生成的文件复制到同一个位置,这(因为复制与生成竞争)失败。如何使生成只发生一次?@jamescacese如果基础项目为子项目生成资源,则应将这些资源生成到每个子项目的
resourceManaged
位置(即在其目标文件夹内)。可能您有一个配置错误的
mappings
指令。我会尝试在每个子项目中定义mappings指令,而不是基本指令,这样
resourceManaged
属性就引用了子项目
resourceManaged
@jamescacese,更好的做法是将resourceGeneration提取到一个SBT插件中,并在每个子项目中使用它。这样,上下文将是子项目,因此
resourceManaged
将引用子项目
resourceManaged
。使用我写的这个答案,它可以作为解决问题的指南。
mappings in (Compile, packageSrc) ++= {
  val allGeneratedFiles = ((resourceManaged in Compile).value ** "*") filter { _.isFile }
  allGeneratedFiles.get pair relativeTo((resourceManaged in Compile).value)
}