Как скопировать саму папку с project.copy в gradle?

#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 . Но это будет медленнее, если источником был сетевой ресурс. Что произойдет, если исходным кодом был файл?