【问题标题】:How do I copy a zip dependency to the target directory in an SBT build?如何将 zip 依赖项复制到 SBT 构建中的目标目录?
【发布时间】:2018-06-30 01:05:19
【问题描述】:

我正在开发一个通过sat-native-packager 生成 RPM 的 SBT 项目。我想要提取到 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,但如果必须,我会这样做。

我最终需要解压缩target/ 下的ZIP 文件,这样我就可以定义一个或多个packageMapping 条目来将文件拉入RPM,但如果可以的话,通过sbt.IO 似乎很容易做到首先获取从我们的 Artifactory 服务器下载的原始 ZIP 文件的引用。

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

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

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

    【讨论】:

    • 我不得不把下一行改成packageBin in Compile := ((packageBin in Compile).dependsOn(unpackUtilsTask)).value`
    猜你喜欢
    • 2019-01-27
    • 2016-07-14
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 2012-03-26
    • 2015-09-24
    相关资源
    最近更新 更多