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
.
Вы можете использовать другие методы из других ответов, чтобы распаковать файл, если это необходимо.