2

我正在开发一个 SBT 项目,该项目通过sat-native-packager. 我想要拉入 RPM 的项目之一是使用sat-pack插件从单独项目发布的 ZIP 文件。此 ZIP 文件包含许多 JAR 文件,以及用于调用它们的多个脚本。

我的 RPM 项目中有以下内容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,如果我可以首先获取对原始 ZIP 文件的引用,即从我们的 Artifactory 服务器下拉。

4

1 回答 1

2

几天后没有得到任何回应,但我会发布经过更多试验和错误后我能够提出的答案。

通过检查 ,我走在了正确的轨道上UpdateReport,但我没有查看其中的正确数据。我需要深入查找一个ModuleReport.zip 文件,它会告诉我 .zip 文件在构建机器上的下载位置。一旦我有了那条路径,将其解压缩以target/使用IO.unzip(). 这是我的任务最终的样子:

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 之前会对其进行解压缩,我们可以定义packageMappings 将 .zip 文件的内容放入生成的 RPM 中。

于 2018-06-29T17:05:19.147 回答