gpt4 book ai didi

sbt - 使用 SBT 解压缩工件

转载 作者:行者123 更新时间:2023-12-03 14:19:49 25 4
gpt4 key购买 nike

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

我的问题是:

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

    如果要提取一组托管依赖项,下面的代码应该可以工作。我在 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,

    关于sbt - 使用 SBT 解压缩工件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9378891/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com