我有一个 gradle 项目,它需要使用 http 在互联网上某处可用的一些数据文件。目标是这个不可变的远程文件在第一次构建时被拉取一次。后续版本不应再次下载。
如何指示 gradle 将给定文件提取到本地目录?
我试过了
task fetch(type:Copy) {
from 'http://<myurl>'
into 'data'
}
但似乎复制任务类型无法处理http。
额外的问题:有没有办法像恢复以前中止/中断的下载一样wget -c
?
我有一个 gradle 项目,它需要使用 http 在互联网上某处可用的一些数据文件。目标是这个不可变的远程文件在第一次构建时被拉取一次。后续版本不应再次下载。
如何指示 gradle 将给定文件提取到本地目录?
我试过了
task fetch(type:Copy) {
from 'http://<myurl>'
into 'data'
}
但似乎复制任务类型无法处理http。
额外的问题:有没有办法像恢复以前中止/中断的下载一样wget -c
?
怎么样:
def f = new File('the file path')
if (!f.exists()) {
new URL('the url').withInputStream{ i -> f.withOutputStream{ it << i }}
}
您可能可以为此使用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)
}
}
试试这样:
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
对我来说工作正常..
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/了解到这一点)。
刚刚在 gradle 论坛上遇到了关于即将下载任务的帖子。
对我来说似乎是完美的解决方案。虽然(尚未)在官方 gradle 版本中可用
使用以下插件:
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
}
}
希望它有所帮助:)
@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))
}