2012-02-21 31 views
5

Como parte de mi proyecto, me gustaría descomprimir un artefacto zip de una dependencia gestionada en un directorio específico del proyecto. Antes de comenzar a usar SBT, estaba haciendo esto a través de un script ANT que buscaba el artefacto zip de una dependencia maven y lo descomprimía.Descompresión de un artefacto con SBT

Mi pregunta (s) son:

  • cómo especificar que yo quiero depender de la dependencia postal? He definido así: "eu.delving" % "sip-creator" % "0.4.6-SNAPSHOT" pero esto no obtiene ningún artefacto postal
  • dónde/cómo enlazar en el proceso de construcción para ejecutar el descomprimir (y cómo hacer referencia al archivo artefacto en ese contexto)?
+0

¿Alguna suerte solucionando esto? – Arjan

+0

Aún no. Hasta el momento todavía estoy usando la versión ANT para hacerlo –

+0

Para la segunda parte sobre enganchar la acción de descompresión debes consultar el wiki de Tareas https://github.com/harrah/xsbt/wiki/Tasks. Busque cómo declararlos y luego establecer dependencias para que se activen durante la construcción o el empaquetado. –

Respuesta

6

Si desea extraer un conjunto de dependencias gestionadas, el siguiente código debería funcionar. Lo probé en sbt 0.12.0, pero también debería funcionar 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: _*) 
} 

Si simplemente tiene archivos jar para extraer, puede agregarlos como dependencias no administradas, es decir. poniéndolos en la carpeta/lib. Ver: https://github.com/harrah/xsbt/wiki/Getting-Started-Library-Dependencies

Si realmente tiene archivos zip (o desea extraer las dependencias no administrados), puede cambiar el código anterior para enumerarlos:

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

Ahora debería ser capaz de extraer manualmente desde SBT y que automáticamente se deben extraer antes de compilación:

> 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 

Ahora puede añadir una nueva tarea o ampliar la existente que extrae el archivo zip de la dependencia extraída. Si no necesita el contenido de la dependencia, puede usar la configuración de tarea-directorio-temporal que le proporciona un directorio temporal que puede ser escrito por sbt:

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

Gracias. Sí, realmente tengo un archivo ZIP que se produce como un artefacto en un repositorio maven. Comprobaré en los próximos días cómo SBT puede recuperarlo y luego usaré tu código para hacer el trabajo. –