[英]How do I copy a zip dependency to the target directory in an SBT build?
我正在研究一个通过sat-native-packager
生成RPM的SBT项目。 我要拉入RPM的项目之一是ZIP文件,该文件是使用sat-pack
插件从单独的项目发布的。 该ZIP文件包含许多JAR文件,以及用于调用它们的多个脚本。
我在RPM项目的build.sbt
具有以下build.sbt
:
libraryDependencies += ("com.mycompany" %% "aputils" % "1.0.0-SNAPSHOT").artifacts(Artifact("aputils", "zip", "zip"))
// Task to download and unpack the utils bundle
lazy val unpackUtilsTask = taskKey[Unit]("Download the utils bundle to the target directory")
unpackUtilsTask := {
val log = streams.value.log
val report: UpdateReport = (update in Rpm).value
val filter = artifactFilter(extension = "zip")
val matches: Seq[File] = report.matching(filter)
matches.foreach{ f =>
log.info(s"Filter match: ${f}")
IO.copyFile(f, target.value)
}
}
当我运行此任务时,它与UpdateReport
中的任何条目都不匹配。 没有打印任何内容,也没有文件复制到target/
。 如果我修改任务以改为打印UpdateReport
中的所有文件:
report.allFiles.foreach(f => log.info(s"All files: $f))
我看到了许多JAR文件,但没有看到我的ZIP文件。 JAR文件原来是ZIP文件中包含的所有JAR文件。 我不确定为什么要解压缩ZIP并将其内容列出为像这样的依赖项。 如果我将依赖项标记为notTransitive
,则报告中不会列出所包含的JAR,但是ZIP也不包括在内。
该项目正在使用SBT 0.13.15。 我希望此时不将其更新为1.x,但是如果需要的话,我会这样做。
我最终需要将ZIP文件解压缩到target/
下,以便我可以定义一个或多个packageMapping
条目以将文件拉入RPM,但这似乎很容易通过sbt.IO
,如果我可以先获得对从我们的Artifactory服务器提取的原始ZIP文件。
几天后没有得到任何答复,但是我将发布经过更多的尝试和错误后能够提出的答案。
通过检查UpdateReport
,我处在正确的轨道上,但是我没有在其中查看正确的数据。 我需要深入查找以找到ModuleReport
,该模块可以显示.zip文件在构建计算机上的下载位置。 一旦有了该路径,就可以使用IO.unzip()
将其解压缩到target/
。 这是我的任务最终的外观:
libraryDependencies += ("com.mycompany" %% "aputils" % "1.0.0-SNAPSHOT").artifacts(Artifact("aputils", "zip", "zip"))
// Task to unzip the utils ZIP file to the target directory so we can define a package mapping
lazy val unpackUtilsTask = taskKey[Unit]("Download the utils bundle to the target directory")
unpackUtilsTask := {
val log = streams.value.log
val cReport: ConfigurationReport = (update in Compile).value.configuration("compile").get
cReport.modules.foreach{ mReport =>
if (mReport.module.name.startsWith("aputils")) {
mReport.artifacts.foreach{ case (art, f) =>
log.info(s"Unpacking aputils bundle: ${f.getAbsolutePath}")
IO.unzip(f, target.value)
}
}
}
}
packageBin in Rpm := ((packageBin in Rpm).dependsOn(unpackUtilsTask)).value
最后一行将任务附加到构建RPM的任务,因此将在构建RPM之前将其解压缩,并且我们可以定义packageMapping
来将.zip文件的内容放入生成的RPM中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.