Распаковка артефакта с помощью SBT - PullRequest
5 голосов
/ 21 февраля 2012

Как часть моей сборки проекта, я хотел бы распаковать zip-артефакт управляемой зависимости в определенный каталог проекта. Перед тем, как начать использовать SBT, я делал это с помощью сценария ANT, который извлекал бы артефакт zip из зависимости maven и распаковывал его.

Мои вопросы:

  • как указать, что я хочу зависеть от зависимости zip? Я определил это так: "eu.delving" % "sip-creator" % "0.4.6-SNAPSHOT" но это не приводит к артефакту почтового индекса
  • где / как подключиться к процессу сборки для запуска распаковки (и как обратиться к файлу артефакта в этом контексте)?

1 Ответ

6 голосов
/ 12 октября 2012

Если вы хотите извлечь набор управляемых зависимостей, приведенный ниже код должен работать.Я протестировал его в 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-временный каталог, который дает вам временный каталог, доступный для записи с помощью sbt:

// define the target directory
extractJarsTarget <<= taskTemporaryDirectory,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...