#gradle #groovy
Вопрос:
Копирование подобной папки копирует только содержимое исходного файла в целевой каталог. Как скопировать саму папку в целевой каталог?
project.copy {
from "$source"
into "$targetDirectory"
}
Например, если
def source = "d:\my\docs" // containing files and subfolders
def targetDirectory = "d:\destination"
и
> ls d:mydocs
file1.txt
file2.xyz
subfolder/
...
затем project.copy
в первом фрагменте кода появится
> ls d:destination
file1.txt
file2.xyz
subfolder/
Ожидаемым результатом является копирование самой папки «Документы», а не только ее содержимого.
> ls d:destination
docs/
Поскольку я еще не знаю путей, один из способов-получить имя из источника
def src = new File("$source")
project.copy {
from src
if (source.isDirectory())
into "$targetDirectory\$src.name" //src.name == "docs"
else
into "$targetDirectory"
}
Есть ли лучший способ сделать это, project.copy
который работает как для файлов, так и для каталогов?
Ответ №1:
Я думаю, ты хочешь
project.copy {
from 'd:/my'
include 'docs/**'
into targetDirectory
}
Или, возможно,
project.mkdir "$targetDirectory/docs"
project.copy {
from 'd:/my/docs'
into "$targetDirectory/docs"
}
Второй вариант, скорее всего, будет быстрее, если под ним находится множество других исключенных файлов/каталогов. d:/my (поскольку gradle перечислит все файлы/каталоги и проверит их на соответствие критериям «включить»)
Комментарии:
1. Я не знаю
$source
пути заранее. Это может быть даже файл. Поэтому мне все еще нужно получить имяdocs/
папки сnew File('d:/my/docs').name
помощью . По сути, вы делаете то же самое во втором фрагменте, что и я. Первый фрагмент выглядит как хорошая альтернатива, и его можно получить с помощьюnew File('d:/my/docs').parent
. Но это будет медленнее, если источником был сетевой ресурс. Что произойдет, если исходным кодом был файл?