繁体   English   中英

如何将zip依赖项复制到SBT构建中的目标目录?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM