如何在gradle中下载外部文件?

时间:2013-06-15 12:25:02

标签: gradle

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

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

我试过

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

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

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

7 个答案:

答案 0 :(得分:45)

如何:

def f = new File('the file path')
if (!f.exists()) {
    new URL('the url').withInputStream{ i -> f.withOutputStream{ it << i }}
}

答案 1 :(得分:26)

您可以使用Ant task Get来实现此目的。我相信这个Ant任务不支持恢复下载。

为此,您可以创建名为MyDownload的自定义任务。这基本上可以是任何类名。此自定义任务定义输入和输出,用于确定是否需要执行任务。例如,如果文件已下载到指定目录,则该任务将标记为“最新”。在内部,此自定义任务通过内置Get使用Ant任务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)
    }
}

答案 2 :(得分:14)

尝试这样:

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

对我来说工作得很好..

答案 3 :(得分:2)

刚刚在gradle论坛上遇到了post on upcoming download task
看起来对我来说是完美的解决方案..虽然

还没有(还)正式发布

答案 4 :(得分:2)

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/了解到这一点。)

答案 5 :(得分:0)

使用以下插件:

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
    }
}

希望对您有所帮助:)

答案 6 :(得分:0)

@Benjamin的答案的科特琳版

1.2.0