Ответ 1
Как насчет просто:
def f = new File('the file path')
if (!f.exists()) {
new URL('the url').withInputStream{ i -> f.withOutputStream{ it << i }}
}
У меня есть проект 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. Я считаю, что эта задача Ant не поддерживает возобновление загрузки.
Для этого вы можете создать пользовательское задание с именем MyDownload
. Это может быть любое имя класса в принципе. Эта пользовательская задача определяет входы и выходы, которые определяют, нужно ли выполнять задачу. Например, если файл уже был загружен в указанный каталог, задача помечается как UP-TO-DATE. Внутренне эта пользовательская задача использует задачу Ant 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
Для меня отлично работает.
только что столкнулся с сообщением о предстоящей задаче загрузки на форуме gradle.
Похоже на идеальное решение для меня.. Не (пока) доступно в официальном релизе gradle, хотя
Предложение в комментарии Бена Манеса имеет то преимущество, что оно может использовать координаты maven и разрешение зависимости maven. Например, для загрузки банки Derby:
Определите новую конфигурацию:
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/).
Используя следующий плагин:
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
}
}
Надеюсь, это помогло :)