50

我有一个 gradle 项目,它需要使用 http 在互联网上某处可用的一些数据文件。目标是这个不可变的远程文件在第一次构建时被拉取一次。后续版本不应再次下载。

如何指示 gradle 将给定文件提取到本地目录?

我试过了

task fetch(type:Copy) {
   from 'http://<myurl>'
   into 'data'
}

但似乎复制任务类型无法处理http。

额外的问题:有没有办法像恢复以前中止/中断的下载一样wget -c

4

7 回答 7

61

怎么样:

def f = new File('the file path')
if (!f.exists()) {
    new URL('the url').withInputStream{ i -> f.withOutputStream{ it << i }}
}
于 2013-06-15T13:36:44.790 回答
32

您可能可以为此使用Ant 任务 Get。我相信这个 Ant 任务不支持恢复下载。

为此,您可以使用 name 创建自定义任务MyDownload。基本上可以是任何类名。此自定义任务定义确定是否需要执行任务的输入和输出。例如,如果文件已下载到指定目录,则任务标记为 UP-TO-DATE。在内部,这个自定义任务Get通过内置的AntBuilder.

有了这个自定义任务,您可以创建一个新的增强型任务MyDownload(您的自定义任务类)。此任务设置输入和输出属性。如果您希望执行此任务,请将其连接到您通常通过任务依赖项(dependsOn方法)运行的任务。下面的代码片段应该给你的想法:

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

someOtherTask.dependsOn downloadSomething

class MyDownload extends DefaultTask {
    @Input
    String sourceUrl

    @OutputFile
    File target

    @TaskAction
    void download() {
       ant.get(src: sourceUrl, dest: target)
    }
}
于 2013-06-15T13:09:02.980 回答
26

试试这样:

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

apply plugin: 'java'
apply plugin: 'de.undercouch.download'

import de.undercouch.gradle.tasks.download.Download

task downloadFile(type: Download) {
    src 'http://localhost:8081/example/test-jar-test_1.jar'
    dest 'localDir'
}

您可以在此处查看更多信息:https ://github.com/michel-kraemer/gradle-download-task

对我来说工作正常..

于 2015-05-13T11:08:32.433 回答
4

Ben Manes 评论中的建议的优点是它可以利用 maven 坐标和 maven 依赖解析。例如,下载一个 Derby jar:

定义一个新的配置:

configurations {
  derby
}

在依赖项部分,为自定义配置添加一行

dependencies {
  derby "org.apache.derby:derby:10.12.1.1"
}

然后您可以添加一个任务,该任务将在需要时下拉正确的文件(同时利用 Maven 缓存):

task deployDependencies() << {
   String derbyDir = "${some.dir}/derby"
   new File(derbyDir).mkdirs();
      configurations.derby.resolve().each { file ->
        //Copy the file to the desired location
        copy {
          from file 
          into derbyDir
          // Strip off version numbers
          rename '(.+)-[\\.0-9]+\\.(.+)', '$1.$2'
        }
      }
}

(我从https://jiraaya.wordpress.com/2014/06/05/download-non-jar-dependency-in-gradle/了解到这一点)。

于 2016-08-09T09:23:37.653 回答
2

刚刚在 gradle 论坛上遇到了关于即将下载任务的帖子。
对我来说似乎是完美的解决方案。虽然(尚未)在官方 gradle 版本中可用

于 2013-09-30T10:57:28.433 回答
1

使用以下插件:

plugins {
    id "de.undercouch.download" version "3.4.3"
}

对于仅以下载为目的的任务

task downloadFile(type: Download) {
    src DownloadURL
    dest destDir
}

将下载选项包含在您的任务中:

download {
    src DownloadURL
    dest destDir
}

要在您的任务中包含具有多个下载的下载选项:

task downloadFromURLs(){
    download {
        src ([
               DownloadURL1,
               DownloadURL2,
               DownloadURL3
        ])
        dest destDir
    }
}

希望它有所帮助:)

于 2019-05-14T06:30:06.717 回答
1

@Benjamin 答案的 Kotlin 版本

buildscript {
    repositories {
        jcenter()
        google()
    }

    dependencies {
        classpath("com.android.tools.build:gradle:4.0.1")
    }
}

tasks.register("downloadPdf"){
    val path = "myfile.pdf"
    val sourceUrl = "https://file-examples-com.github.io/uploads/2017/10/file-sample_150kB.pdf"
    download(sourceUrl,path)
}

fun download(url : String, path : String){
    val destFile = File(path)
    ant.invokeMethod("get", mapOf("src" to url, "dest" to destFile))
}
于 2020-08-16T07:39:29.297 回答