Url(http
)からファイルをダウンロードして解凍する適切なGradle方法は何ですか?
可能であれば、タスクを実行するたびに再ダウンロードしないようにしたいと思います(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-freeソリューションを期待します。それを達成する機会はありますか?
現在、URLからダウンロードするためのGradle APIはありません。これは、Ant、Groovyを使用して実装できます。Gradleの依存関係の解決/キャッシング機能を利用したい場合は、カスタムアーティファクトURLを含むIvyリポジトリのふりをして実装できます。解凍は通常のGradleの方法(copy
メソッドまたはCopy
タスク)で実行できます。
@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:1.0.3@Zip'
//This maps to the pattern: [organisation]:[module]:[revision]:[classifier]@[ext]
}
GradleキャッシュからZipを取得することを除いて、@ Matthiasの解凍タスクを借用します。
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
}
コピータスクを使用した解凍は次のように機能します。
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
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
}
@RaGeの回答は機能しましたが、ivyレイアウトメソッドが廃止されたため、適応する必要がありました https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.repositoriesを参照してください。 IvyArtifactRepository.html#org.gradle.api.artifacts.repositories.IvyArtifactRepository:layout(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:$project.ext.keycloakAdapterVersion@Zip"
}
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
}
これは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
にダウンロードされます。
必要に応じて、他の回答からの他の方法を使用してファイルを解凍できます。
「ネイティブグラドル」、ダウンロード部分のみ(解凍については他の回答を参照)
task foo {
def src = 'http://example.com/file.Zip'
def destdir = 'somedir'
def destfile = "$destdir/file.Zip"
doLast {
def url = new URL(src)
def f = new File(destfile)
if (f.exists()) {
println "file $destfile already exists, skipping download"
} else {
mkdir "$destdir"
println "Downloading $destfile from $url..."
url.withInputStream { i -> f.withOutputStream { it << i } }
}
}
}