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

时间:2018-06-26 20:30:03

标签: scala sbt

我正在研究一个通过sat-native-packager生成RPM的SBT项目。我要拉入RPM的项目之一是ZIP文件,该文件是使用sat-pack插件从单独的项目发布的。这个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,但如果需要的话,会这样做。

最终,我将需要在target/下解压缩ZIP文件,以便我可以定义一个或多个packageMapping条目以将文件拉入RPM,但这似乎很容易通过{{1 }},如果我能首先获得对从我们的Artifactory服务器下拉的原始ZIP文件的引用。

1 个答案:

答案 0 :(得分:0)

几天后没有得到任何答复,但是我将发布更多经过反复试验后能够提出的答案。

通过检查UpdateReport,我处在正确的轨道上,但是我没有在其中查看正确的数据。我需要深入查找以找到ModuleReport,该文件将向我显示.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之前将其解压缩,我们可以定义packageMapping来将.zip文件的内容放入生成的文件中。 RPM。