Gradle(Kotlin DSL) でファイルダウンロードして解凍

blog1.mammb.com


任意ファイルのダウンロード

任意のファイルをダウンロードは以下のように書くことができます。

val url = "https://path/to/file.zip";  
val file = layout.buildDirectory.file("file.zip")
URI(url).toURL().openStream().use { Files.copy(it, file.get().asFile.toPath()) }

チャネルを使った場合は以下のようにできます。

Channels.newChannel(URI(url).toURL().openStream()).use { ch ->
    FileOutputStream(file.get().asFile).getChannel().use { fc ->
        fc.transferFrom(ch, 0, Long.MAX_VALUE)
    }
}

チャネルを使った方が、効率は良いでしょう。


zip ファイルの解凍

zip ファイルの解凍は、Copy タスクで以下のように実行できます。

tasks.register<Copy>("unzip") {
    val zip = layout.buildDirectory.file("file.zip")
    from(zipTree(zip))
    into(layout.projectDirectory.dir("out"))
}


ダウンロードして解凍

ダウンロードと解凍を合わせると以下のように書けます。

import java.net.URI
import java.nio.file.Files

// ...

tasks.register<Copy>("download") {

    val url = "https://path/to/file.zip";
    val zip = layout.buildDirectory.file("file.zip")
    val out = layout.buildDirectory.dir("out")

    zip.get().also { if (!it.asFile.exists()) 
        URI(url).toURL().openStream().use { str -> Files.copy(str, zip.get().asFile.toPath()) }
    }

    from(zipTree(zip))
    into(out)
}

zip ファイルが存在する場合は、ダウンロードはスキップします。