Подтвердить что ты не робот

Как загрузить внешние файлы в gradle?

У меня есть проект gradle, который требует наличия некоторых файлов данных где-то в Интернете с помощью http. Цель состоит в том, что этот неизменный удаленный файл извлекается один раз при первой сборке. Последующая сборка не должна загружаться снова.

Как я могу дать команду gradle извлечь данный файл в локальный каталог?

Я пробовал

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

но похоже, что тип задачи копирования не может работать с http.

Бонусный вопрос: есть ли способ возобновить ранее прерванную/прерванную загрузку, как это делает wget -c?

4b9b3361

Ответ 1

Как насчет просто:

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

Ответ 2

Возможно, вы могли бы использовать для этого задачу Ant. Я считаю, что эта задача Ant не поддерживает возобновление загрузки.

Для этого вы можете создать пользовательское задание с именем MyDownload. Это может быть любое имя класса в принципе. Эта пользовательская задача определяет входы и выходы, которые определяют, нужно ли выполнять задачу. Например, если файл уже был загружен в указанный каталог, задача помечается как UP-TO-DATE. Внутренне эта пользовательская задача использует задачу Ant Get через встроенный AntBuilder.

С помощью этой пользовательской задачи вы можете создать новую расширенную задачу типа MyDownload (ваш пользовательский класс задач). Эта задача устанавливает свойства ввода и вывода. Если вы хотите, чтобы эта задача была выполнена, подключите ее к задаче, которую вы обычно запускаете, с помощью зависимостей задач (метод зависит dependsOn метода). Следующий фрагмент кода должен дать вам идею:

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

Ответ 3

Попробуйте:

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

Здесь вы можете узнать больше: https://github.com/michel-kraemer/gradle-download-task

Для меня отлично работает.

Ответ 5

Предложение в комментарии Бена Манеса имеет то преимущество, что оно может использовать координаты maven и разрешение зависимости maven. Например, для загрузки банки Derby:

Определите новую конфигурацию:

configurations {
  derby
}

В разделе зависимостей добавьте строку для настраиваемой конфигурации

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

Затем вы можете добавить задачу, которая при необходимости потянет нужные файлы (при использовании кеша maven):

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

(Я узнал это из https://jiraaya.wordpress.com/2014/06/05/download-non-jar-dependency-in-gradle/).

Ответ 6

Используя следующий плагин:

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

Для задачи, которая имеет целью только загрузку

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

Для включения опции загрузки в вашу задачу:

download {
    src DownloadURL
    dest destDir
}

Для включения опции загрузки с несколькими загрузками в вашу задачу:

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

Надеюсь, это помогло :)