web-dev-qa-db-fra.com

gradle - téléchargez et décompressez le fichier à partir de l'URL

Quelle serait la méthode appropriée de téléchargement et de décompression du fichier à partir de l’URL (http)?

Si possible, j'aimerais éviter de retélécharger chaque fois que j'exécute la tâche (dans ant.get peut être obtenu par skipexisting: 'true').

Ma solution actuelle serait:

task foo {
  ant.get(src: 'http://.../file.Zip', dest: 'somedir', skipexisting: 'true')
  ant.unzip(src: 'somedir' + '/file.Zip', dest: 'unpackdir')
}

encore, je m'attendrais à une solution sans fourmi. Une chance de réaliser cela?

19
Peter Butkovic

Il n'y a pas actuellement d'API Gradle pour le téléchargement à partir d'une URL. Vous pouvez l'implémenter à l'aide de Ant, Groovy ou, si vous souhaitez bénéficier des fonctionnalités de résolution de dépendance/mise en cache de Gradle, en prétendant qu'il s'agit d'un référentiel Ivy avec une URL d'artefact personnalisée. La décompression peut être effectuée de la manière habituelle de Gradle (méthode copy ou tâche Copy).

7
Peter Niederwieser

@CMPS:

Supposons donc que vous souhaitiez télécharger ce fichier Zip en tant que dépendance:

https://github.com/jmeter-gradle-plugin/jmeter-gradle-plugin/archive/1.0.3.Zip

Vous définissez votre repo ivy comme:

repositories {
    ivy {
        url 'https://github.com/'
        layout 'pattern', {
            artifact '/[organisation]/[module]/archive/[revision].[ext]'
        }
    }
}

et ensuite l'utiliser comme:

dependencies {
    compile 'jmeter-gradle-plugin:jmeter-gradle-plugin:1.0.3@Zip'
    //This maps to the pattern: [organisation]:[module]:[revision]:[classifier]@[ext]         
}

Emprunt de la tâche de décompression de @Matthias, à l'exception du ramassage du fichier Zip à partir du cache de niveaux

task unzip(type: Copy) {

  def zipPath = project.configurations.compile.find {it.name.startsWith("jmeter") }
  println zipPath
  def zipFile = file(zipPath)
  def outputDir = file("${buildDir}/unpacked/dist")

  from zipTree(zipFile)
  into outputDir
}
42
RaGe

La décompression à l'aide de la tâche de copie fonctionne comme suit:

task unzip(type: Copy) {
  def zipFile = file('src/dists/dist.Zip')
  def outputDir = file("${buildDir}/unpacked/dist")

  from zipTree(zipFile)
  into outputDir
}

http://mrhaki.blogspot.de/2012/06/gradle-goodness-unpacking-archive.html

7
Matthias M

La réponse de @ RaGe fonctionnait bien, mais je devais l'adapter car la méthode de mise en page ivy avait été amortie, voir https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.repositories .IvyArtifactRepository.html # org.gradle.api.artifacts.repositories.IvyArtifactRepository: layout (Java.lang.String,% 20groovy.lang.Closure)

Donc, pour que cela fonctionne, je devais l'adapter à ceci pour un adaptateur de porte-clés Tomcat:

ivy {
    url 'https://downloads.jboss.org/'
    patternLayout {
        artifact '/[organization]/[revision]/adapters/keycloak-oidc/[module]-[revision].[ext]'
    }
}

dependencies {
    // https://downloads.jboss.org/keycloak/4.8.3.Final/adapters/keycloak-oidc/keycloak-Tomcat8-adapter-dist-4.8.3.Final.Zip
    compile "keycloak:keycloak-Tomcat8-adapter-dist:$project.ext.keycloakAdapterVersion@Zip"
}

task unzipKeycloak(type: Copy) {

    def zipPath = project.configurations.compile.find {it.name.startsWith("keycloak") }
    println zipPath
    def zipFile = file(zipPath)
    def outputDir = file("${buildDir}/Tomcat/lib")

    from zipTree(zipFile)
    into outputDir
}
1
Craig