【问题标题】:Unzipping an artifact with SBT使用 SBT 解压缩工件
【发布时间】:2021-03-11 23:33:53
【问题描述】:

作为项目构建的一部分,我想将托管依赖项的 zip 工件解压缩到项目的特定目录中。在开始使用 SBT 之前,我通过一个 ANT 脚本执行此操作,该脚本将从 maven 依赖项中获取 zip 工件并解压缩它。

我的问题是:

  • 如何指定我要依赖的 zip 依赖?我这样定义它: "eu.delving" % "sip-creator" % "0.4.6-SNAPSHOT" 但这不会获取 zip 工件
  • 在哪里/如何挂钩到构建过程以运行解压缩(以及如何在该上下文中引用工件文件)?

【问题讨论】:

  • 还没有。到目前为止,我仍在使用它的 ANT 版本来这样做
  • 关于挂钩解压缩操作的第二部分,您应该查看任务 wiki github.com/harrah/xsbt/wiki/Tasks。查看如何声明它们,然后建立依赖关系,以便在构建或打包时触发。

标签: sbt


【解决方案1】:

如果您想提取一组托管依赖项,下面的代码应该可以工作。我在 sbt 0.12.0 中对其进行了测试,但它也应该适用于 0.11.x。

import sbt._
import Keys._
import Classpaths.managedJars

object TestBuild extends Build {

    lazy val jarsToExtract = TaskKey[Seq[File]]("jars-to-extract", "JAR files to be extracted")

    lazy val extractJarsTarget = SettingKey[File]("extract-jars-target", "Target directory for extracted JAR files")

    lazy val extractJars = TaskKey[Unit]("extract-jars", "Extracts JAR files")

    lazy val testSettings = Defaults.defaultSettings ++ Seq(
        // define dependencies
        libraryDependencies ++= Seq(
            "com.newrelic" % "newrelic-api" % "2.2.1"
        ),

        // collect jar files to be extracted from managed jar dependencies
        jarsToExtract <<= (classpathTypes, update) map { (ct, up) =>
            managedJars(Compile, ct, up) map { _.data } filter { _.getName.startsWith("newrelic-api") }
        },

        // define the target directory
        extractJarsTarget <<= (baseDirectory)(_ / "extracted"),

        // task to extract jar files
        extractJars <<= (jarsToExtract, extractJarsTarget, streams) map { (jars, target, streams) =>
            jars foreach { jar =>
                streams.log.info("Extracting " + jar.getName + " to " + target)
                IO.unzip(jar, target)
            }
        },

        // make it run before compile
        compile in Compile <<= extractJars map { _ => sbt.inc.Analysis.Empty }
    )

    lazy val test: Project = Project("test", file(".")) settings (testSettings: _*)
}

如果您只是要提取 jar 文件,则可以将它们添加为非托管依赖项,即。将它们放入 /lib 文件夹。见:https://github.com/harrah/xsbt/wiki/Getting-Started-Library-Dependencies

如果你真的有 zip 文件(或者想提取非托管的依赖),你可以更改上面的代码来列出它们:

// list jar files to be extracted
jarsToExtract <<= (baseDirectory) map { dir => Seq(dir / "lib" / "newrelic-api-2.2.1.zip") },

您现在应该能够从 sbt 手动提取它们,并且它们应该在编译之前自动提取:

> clean
[success] Total time: 0 s, completed Oct 12, 2012 5:39:16 PM
> extract-jars
[info] Extracting newrelic-api-2.2.1.zip to /Users/balagez/Sites/test/extracted
[success] Total time: 0 s, completed Oct 12, 2012 5:39:22 PM
> compile
[info] Extracting newrelic-api-2.2.1.zip to /Users/balagez/Sites/test/extracted
[success] Total time: 0 s, completed Oct 12, 2012 5:39:24 PM

现在您可以添加新任务或扩展现有任务,从提取的依赖项中提取 zip 文件。如果你不需要依赖的内容,你可以使用 task-temporary-directory 设置,它为你提供一个可被 sbt 写入的临时目录:

// define the target directory
extractJarsTarget <<= taskTemporaryDirectory,

【讨论】:

  • 谢谢。是的,我确实有一个 ZIP 文件,它是作为 maven 存储库上的工件生成的。我会在接下来的几天里检查它是如何被 SBT 检索的,然后使用你的代码来完成这项工作。
猜你喜欢
  • 2015-07-23
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 2017-02-03
相关资源
最近更新 更多