web-dev-qa-db-ja.com

gradle-URLからファイルをダウンロードして解凍する

Url(http)からファイルをダウンロードして解凍する適切なGradle方法は何ですか?

可能であれば、タスクを実行するたびに再ダウンロードしないようにしたいと思います(ant.getskipexisting: 'true')。

私の現在の解決策は:

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

それでも、私はant-freeソリューションを期待します。それを達成する機会はありますか?

28
Peter Butkovic

現在、URLからダウンロードするためのGradle APIはありません。これは、Ant、Groovyを使用して実装できます。Gradleの依存関係の解決/キャッシング機能を利用したい場合は、カスタムアーティファクトURLを含むIvyリポジトリのふりをして実装できます。解凍は通常のGradleの方法(copyメソッドまたはCopyタスク)で実行できます。

7

@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
}
49
RaGe

コピータスクを使用した解凍は次のように機能します。

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

7
Matthias M
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
}
2
HolyM

@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
}
1
Craig

これは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にダウンロードされます。

必要に応じて、他の回答からの他の方法を使用してファイルを解凍できます。

1
Johny

「ネイティブグラドル」、ダウンロード部分のみ(解凍については他の回答を参照)

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 } }
    }
  }
}
0
Daniel Alder