2012-02-21 19 views
5

Come parte del mio progetto di costruzione, vorrei decomprimere un artefatto zip di una dipendenza gestita in una directory specifica del progetto. Prima di iniziare a usare SBT lo stavo facendo con uno script ANT che recuperava l'artefatto zip da una dipendenza da esperti e lo decomprimeva.Come decomprimere un artefatto con SBT

La mia domanda (s) sono:

  • come specificare che voglio dipendere la dipendenza zip? Ho definito in questo modo: "eu.delving" % "sip-creator" % "0.4.6-SNAPSHOT" ma questo non recupera l'artefatto zip
  • dove/come, per il collegamento nel processo di generazione per eseguire il decomprimere (e come fare riferimento al file manufatto in quel contesto)?
+0

Qualsiasi fortuna risolvere questo? – Arjan

+0

Non ancora. Finora sto ancora usando la versione ANT per farlo –

+0

Per la seconda parte riguardante l'aggancio dell'operazione di decompressione dovresti controllare il wiki delle attività https://github.com/harrah/xsbt/wiki/Tasks. Cercare come dichiararli e quindi stabilire le dipendenze in modo che si inneschino durante la costruzione o l'imballaggio. –

risposta

6

Se si desidera estrarre un insieme di dipendenze gestite, il codice riportato di seguito dovrebbe funzionare. L'ho testato in SBT 0.12.0, ma dovrebbe funzionare anche con 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: _*) 
} 

Se si dispone semplicemente di file jar da estrarre, è possibile aggiungerli come dipendenze non gestite, ad es. inserendoli nella cartella/lib. Vedi: https://github.com/harrah/xsbt/wiki/Getting-Started-Library-Dependencies

Se davvero avete file zip (o desidera estrarre le dipendenze non gestiti), è possibile modificare il codice qui sopra per elencarli:

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

Ora dovrebbe essere in grado di estrarre manualmente da SBT e dovrebbero automaticamente essere estratti prima della compilazione:

> 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 

Ora è possibile aggiungere una nuova attività o ampliare quello esistente che estrae il file zip dalla dipendenza estratto. Se non è necessario il contenuto della dipendenza, è possibile utilizzare l'impostazione di task-temporanea-directory che ti dà una directory temporanea scrivibile da SBT:

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

Grazie. Sì, ho davvero un file ZIP che viene prodotto come un artefatto su un repository di Maven. Controllerò nei prossimi giorni come può essere recuperato da SBT e poi usa il tuo codice per fare il lavoro. –