2013-06-15 8 views
30

Mam projekt gradle, który wymaga pewnych plików danych dostępnych gdzieś w Internecie przy użyciu http. Celem jest, aby ten niezmienny zdalny plik był pobierany raz przy pierwszej kompilacji. Późniejsza kompilacja nie powinna być ponownie pobierana.jak pobierać pliki zewnętrzne w gradle?

Jak mogę nakazać gradle pobranie danego pliku do lokalnego katalogu?

Próbowałem

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

ale wydaje się, że typ zadania kopiowania nie może poradzić sobie z http.

Pytanie dodatkowe: czy istnieje sposób, aby wznowić wcześniej przerwane/przerwane pobieranie, tak jak robi to wget -c?

+2

Zrobiłem to przed użyciem niestandardowych konfiguracji, dzięki czemu mogę zadeklarować zasób jako zależność dla wersji. Wtedy normalna obsługa rozdzielczości ma swoją magię dla ciebie –

+0

Istnieje dobra odpowiedź tutaj: https://stackoverflow.com/a/34327202/2873507 –

Odpowiedz

20

Prawdopodobnie można użyć do tego celu Ant task Get. Wierzę, że to zadanie Ant nie obsługuje wznawiania pobierania.

W tym celu można utworzyć niestandardowe zadanie o nazwie MyDownload. To może być dowolna nazwa klasy. To niestandardowe zadanie definiuje dane wejściowe i wyjściowe określające, czy zadanie ma zostać wykonane. Na przykład, jeśli plik został już pobrany do określonego katalogu, zadanie jest oznaczone UP-TO-DATE. Wewnętrznie to niestandardowe zadanie korzysta z zadania Ant Get za pośrednictwem wbudowanego AntBuilder.

Za pomocą tego niestandardowego zadania można utworzyć nowe rozszerzone zadanie typu MyDownload (niestandardowa klasa zadań). To zadanie ustawia właściwości wejścia i wyjścia. Jeśli chcesz, aby to zadanie było wykonywane, podłącz je do zadania, które zwykle uruchamiasz za pomocą zależności zadań (metoda dependsOn). Poniższy fragment kodu powinien dać Ci pomysł:

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) 
    } 
} 
+0

Fyi all, możesz ustawić ant proxy, używając 'ant.setproxy (proxyhost: System .props ['http.proxyHost'], ...) '. –

+0

+1 Działa z przekierowaniami HTTP (np. 301)! –

+0

Zawsze miło jest widzieć autorów podręczników, odpowiadających na pytania dotyczące SO. Jest to bardzo przydatne. Po prostu użyłem tego, aby wskazać plik JAR wydania binarnego na GitHub. Dzięki Benjamin! – tmn

32

jak o tylko:

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

Działa dobrze, konfiguracja gradle proxy działa natychmiast po uruchomieniu! –

+3

Nie działa w przypadku przekierowań HTTP (na przykład 301). –

+1

Działa dobrze, ale czy możesz zaproponować jakieś wskazówki do pobrania katalogu? –

2

właśnie wpadł post on upcoming download task na Gradle forum.
Wygląda na to idealne rozwiązanie dla mnie .. (jeszcze) nie dostępne w oficjalnym wydaniu Gradle choć

+0

Ten link jest już martwy ... – Adam

+0

Thx za powiadomienie, zaktualizowałem adres URL (ostatnio zostało przeniesione forum gradle) – roomsg

+0

Jestem pewien, że będzie on również umieszczony na liście jako "inkubacja" przez lata. – spy

12

Spróbuj tak:

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' 
} 

Można sprawdzić więcej tutaj: https://github.com/michel-kraemer/gradle-download-task

Dla mnie działa dobrze ..

1

Sugestia zawarta w komentarzu Bena Manesa ma tę zaletę, że może wykorzystać zalety maven coordinates i maven dependency dependency.Na przykład, za pobraniem słoik Derby:

zdefiniować nową konfigurację:

configurations { 
    derby 
} 

W sekcji zależne, dodaj linię do konfiguracji niestandardowej

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

Następnie można dodać zadanie który będzie pobierał właściwe pliki w razie potrzeby (korzystając z pamięci podręcznej):

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' 
     } 
     } 
} 

(Nauczyłem się tego od https://jiraaya.wordpress.com/2014/06/05/download-non-jar-dependency-in-gradle/).

Powiązane problemy