it-swarm.com.de

Wie lade ich externe Dateien in Gradle herunter?

Ich habe ein gradle-Projekt, das einige Datendateien benötigt, die irgendwo im Internet über http verfügbar sind. Das Ziel ist, dass diese unveränderliche entfernte Datei beim ersten Erstellen einmal abgerufen wird. Der nachfolgende Build sollte nicht erneut heruntergeladen werden.

Wie kann ich gradle anweisen, die angegebene Datei in ein lokales Verzeichnis abzurufen?

Ich habe es versucht

task fetch(type:Copy) {
   from 'http://<myurl>'
   into 'data'
}

es scheint jedoch, dass der Aufgabentyp Kopieren nicht mit http umgehen kann.

Bonusfrage: Gibt es eine Möglichkeit, einen zuvor abgebrochenen/unterbrochenen Download wie bei wget -c Fortzusetzen?

37

Wie wäre es einfach:

def f = new File('the file path')
if (!f.exists()) {
    new URL('the url').withInputStream{ i -> f.withOutputStream{ it << i }}
}
45
Ryan Stewart

Sie könnten dafür wahrscheinlich die Ant task Get verwenden. Ich glaube, diese Ant-Aufgabe unterstützt nicht die Wiederaufnahme eines Downloads.

Zu diesem Zweck können Sie eine benutzerdefinierte Aufgabe mit dem Namen MyDownload erstellen. Das kann grundsätzlich jeder Klassenname sein. Diese benutzerdefinierte Aufgabe definiert Eingaben und Ausgaben, die bestimmen, ob die Aufgabe ausgeführt werden muss. Wenn die Datei beispielsweise bereits in das angegebene Verzeichnis heruntergeladen wurde, wird die Aufgabe als AKTUALISIERT markiert. Intern verwendet diese benutzerdefinierte Aufgabe die Ant-Aufgabe Get über die integrierte AntBuilder.

Mit dieser benutzerdefinierten Aufgabe können Sie eine neue erweiterte Aufgabe vom Typ MyDownload (Ihre benutzerdefinierte Aufgabenklasse) erstellen. Diese Task legt die Eingabe- und Ausgabeeigenschaften fest. Wenn Sie möchten, dass diese Aufgabe ausgeführt wird, schließen Sie sie an die Aufgabe an, die Sie normalerweise über Aufgabenabhängigkeiten ausführen (Methode dependsOn). Das folgende Code-Snippet sollte Ihnen die Idee geben:

task downloadSomething(type: MyDownload) {
    sourceUrl = 'http://www.someurl.com/my.Zip'
    target = new File('data')
}

someOtherTask.dependsOn downloadSomething

class MyDownload extends DefaultTask {
    @Input
    String sourceUrl

    @OutputFile
    File target

    @TaskAction
    void download() {
       ant.get(src: sourceUrl, dest: target)
    }
}
27

Versuchen Sie es so:

plugins {
    id "de.undercouch.download" version "1.2"
}

apply plugin: 'Java'
apply plugin: 'de.undercouch.download'

import de.undercouch.gradle.tasks.download.Download

task downloadFile(type: Download) {
    src 'http://localhost:8081/example/test-jar-test_1.jar'
    dest 'localDir'
}

Sie können mehr hier überprüfen: https://github.com/michel-kraemer/gradle-download-task

Für mich funktioniert gut ..

16
Maksim Kriuchko

Der Vorschlag in Ben Manes 'Kommentar hat den Vorteil, dass er die Maven-Koordinaten und die Auflösung der Maven-Abhängigkeit nutzen kann. Zum Herunterladen eines Derby-Glases:

Definieren Sie eine neue Konfiguration:

configurations {
  derby
}

Fügen Sie im Abschnitt Abhängigkeiten eine Zeile für die benutzerdefinierte Konfiguration hinzu

dependencies {
  derby "org.Apache.derby:derby:10.12.1.1"
}

Dann können Sie eine Aufgabe hinzufügen, die bei Bedarf die richtigen Dateien abruft (und dabei den Maven-Cache nutzt):

task deployDependencies() << {
   String derbyDir = "${some.dir}/derby"
   new File(derbyDir).mkdirs();
      configurations.derby.resolve().each { file ->
        //Copy the file to the desired location
        copy {
          from file 
          into derbyDir
          // Strip off version numbers
          rename '(.+)-[\\.0-9]+\\.(.+)', '$1.$2'
        }
      }
}

(Ich habe dies gelernt von https://jiraaya.wordpress.com/2014/06/05/download-non-jar-dependency-in-gradle/ ).

3
Holly Cummins

bin gerade auf einen post über anstehende download aufgabe im gradle forum gestoßen.
Sieht für mich nach der perfekten Lösung aus. (Noch) nicht in einer offiziellen Gradle-Version verfügbar

2
roomsg

Verwendung des folgenden Plugins:

plugins {
    id "de.undercouch.download" version "3.4.3"
}

Für eine Aufgabe, die nur zum Herunterladen dient

task downloadFile(type: Download) {
    src DownloadURL
    dest destDir
}

Um die Download-Option in Ihre Aufgabe aufzunehmen:

download {
    src DownloadURL
    dest destDir
}

Um die Download-Option mit mehreren Downloads in Ihre Aufgabe aufzunehmen:

task downloadFromURLs(){
    download {
        src ([
               DownloadURL1,
               DownloadURL2,
               DownloadURL3
        ])
        dest destDir
    }
}

Hoffe es hat geholfen :)

1
Vikas Tawniya