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

Mic*_*len 9 scala jar sbt

我一直在写一个生成资源的SBT插件resource_managed.我现在希望将这些生成的资源包含在生成的jar中,如SBT docs详细说明:

生成资源:

默认情况下,生成的资源不包含在打包的源工件中.为此,请像添加其他映射一样添加它们.请参阅将文件添加到包中

我已经阅读了文档但老实说如何做到这一点我无法弄清楚.任何人都可以解释它或指向另一个项目,这样我就可以看到他们是如何做到的?

lpi*_*ora 11

首先澄清一下,它们包含在包含编译类的jar中.它们不包含在含有来源的罐子中.

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

对于packageBin生成的文件应该已经包含 - 只需确保从生成器方法返回所有生成的文件.假设您想将它们打包在sources工件中,这就是您必须要做的.

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

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
Run Code Online (Sandbox Code Playgroud)

要在生成的源中包含它,您必须告诉sbt res.properties必须在生成的源artefact中复制的位置.生成包装源的任务被调用packageSrc,因此您必须将作用域设置为该任务.

mappings in (Compile, packageSrc) += {
   ((resourceManaged in Compile).value / "stack-overflow" / "res.properties") -> "path/in/jar/res.properties"
}
Run Code Online (Sandbox Code Playgroud)

因为您的生成器可以生成许多任务,并且每个手动映射将是一项繁琐的任务,sbt为您提供了一次实现多个路径映射的实用程序.

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

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