gradle でファイルダウンロードを自動化する

f:id:Naotsugu:20150224234525p:plain

ファイルのダウンロード

ダウンロードプラグインを使うと簡単。

plugins {
    id 'java'
    id "de.undercouch.download" version "1.2"
}

repositories {
    mavenCentral()
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.2.1'
}

task downloadAndUnzip {
    outputs.upToDateWhen { file('data').exists() }
    doLast {
        def downloadedFile = new File(buildDir, 'downloaded/some.zip')
        download {
            src 'http://www.someurl.com/some.zip'
            dest downloadedFile
        }
        copy {
            from zipTree(downloadedFile)
            into new File(projectDir, 'data')
        }
    }
}
  • ファイルダウンロードプラグインを指定
  • download タスクで指定したURLからファイルダウンロード
  • ダウンロードしたファイルはプロジェクトディレクトリ直下の dest の中に展開
  • upToDate 判定を dest ディレクトリの存在確認で実施(2回目からはスキップされる)

プラグインを使わないと

以下のように書ける。

def f = new File('data')
if (!f.exists()) {
    new URL('http://www.someurl.com/some.zip').withInputStream{ i -> f.withOutputStream{ it << i }}
}

けど、プロキシ経由できなかったり、リダイレクトに対応できない模様。

そんな場合は Ant の助けを借りて以下。

task downloadSomething(type: MyDownload) {
    sourceUrl = 'http://www.someurl.com/some.zip'
    target = file('data')
}

someOtherTask.dependsOn downloadSomething

class MyDownload extends DefaultTask {
    @Input
    String sourceUrl

    @OutputFile
    File target

    @TaskAction
    void download() {
       ant.get(src: sourceUrl, dest: target)
    }
}

Gradle Effective Implementation Guide

Gradle Effective Implementation Guide

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築