it-swarm.com.de

gradle - Datei herunterladen und entpacken von URL

Was wäre der richtige Weg, um die Datei von URL (http) herunterzuladen und zu entpacken?

Wenn möglich, möchte ich das erneute Herunterladen bei jeder Ausführung der Aufgabe verhindern (in ant.get kann durch skipexisting: 'true' erreicht werden).

Meine derzeitige Lösung wäre:

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

trotzdem würde ich eine ameisenfreie Lösung erwarten. Irgendwelche Chance, das zu erreichen?

19
Peter Butkovic

Derzeit gibt es keine Gradle-API zum Herunterladen von einer URL. Sie können dies mit Ant, Groovy oder, wenn Sie von den Abhängigkeitsauflösungs-/Caching-Funktionen von Gradle profitieren möchten, implementieren, indem Sie vorgeben, es sei ein Ivy-Repository mit einer benutzerdefinierten Artefakt-URL. Das Entpacken kann auf die übliche Gradle-Weise (copy-Methode oder Copy-Task) erfolgen.

7

@CMPS:

Nehmen wir an, Sie möchten diese ZIP-Datei als Abhängigkeit herunterladen:

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

Sie definieren Ihr Efeu-Repo als:

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

und dann verwenden Sie es als:

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

Entpacken von @Matthias 'Entpack-Task mit Ausnahme des Zip-Archivs aus Gradle Cache

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

Das Entpacken mit der Kopieraufgabe funktioniert folgendermaßen:

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
plugins {
    id 'de.undercouch.download' version '4.0.0'
}

/**
 * The following two tasks download a Zip file and extract its
 * contents to the build directory
 */
task downloadZipFile(type: Download) {
    src 'https://github.com/gradle-download-task/archive/1.0.Zip'
    dest new File(buildDir, '1.0.Zip')
}

task downloadAndUnzipFile(dependsOn: downloadZipFile, type: Copy) {
    from zipTree(downloadZipFile.dest)
    into buildDir
}
2
HolyM

Die Antwort von @ RaGe funktionierte, aber ich musste sie anpassen, da die Efeu-Layout-Methode abgeschwächt wurde. Siehe 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)

Damit es funktioniert, musste ich es für einen Tomcat-Keycloak-Adapter anpassen:

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:[email protected]"
}

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

Dies funktioniert mit Gradle 5 (getestet mit 5.5.1):

task download {
    doLast {
        def f = new File('file_path')
        new URL('url').withInputStream{ i -> f.withOutputStream{ it << i }}
    }
}

Durch Aufrufen von gradle download Wird die Datei von url nach file_path Heruntergeladen.

Sie können bei Bedarf die anderen Methoden aus anderen Antworten verwenden, um die Datei zu entpacken.

1
Johny