Gradle - загрузить и распаковать файл с URL-адреса

Каким будет правильный gradle способ загрузки и распаковки файла с URL-адреса (http)?

Если возможно, я бы хотел предотвратить повторную загрузку при каждом запуске задачи (в ant.get может быть достигнуто skipexisting: 'true').

Мое текущее решение:

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

я ожидал бы ant -бесплатного решения. Есть ли шанс достичь этого?

Ответы

Ответ 1

В настоящее время нет API Gradle для загрузки из URL-адреса. Вы можете реализовать это с помощью Ant, Groovy или, если вы хотите использовать функции разрешения/кеширования Gradle, делая вид, что это репозиторий Ivy с пользовательским URL-адресом артефакта. Распаковка может выполняться обычным способом Gradle (copy или copy).

Ответ 2

@CMPS:

Допустим, вы хотите загрузить этот zip файл в качестве зависимости:

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

Вы определяете свое репо Ivy как:

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

а затем использовать его как:

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

Занимать задачу распаковки @Matthias ', кроме того, чтобы взять zip из кэша gradle:

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
}

Ответ 3

Распаковка с использованием задачи копирования работает следующим образом:

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

Ответ 4

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
}

Ответ 5

Я получил рабочий ответ @RaGe, но мне пришлось его адаптировать, поскольку метод макета плюща устарел, см. Https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.repositories.IvyArtifactRepository.html# org.gradle.api.artifacts.repositories.IvyArtifactRepository: компоновка (java.lang.String, %20groovy.lang.Closure)

Поэтому, чтобы заставить его работать, мне пришлось настроить его на адаптер для ключа от 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:[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
}

Ответ 6

Это работает с Gradle 5 (протестировано с 5.5.1):

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

Вызов gradle download загружает файл из url в file_path.

Вы можете использовать другие методы из других ответов, чтобы распаковать файл, если это необходимо.