Скопировать дерево с помощью gradle и изменить структуру?
Может ли gradle изменить структуру дерева при копировании?
оригинальный
желаемый
- Dest/мод-а/источник
- Dest/мод-б/источник
- Dest/мод-с/источник
Я не уверен, где я должен создать закрытие и переопределить логику дерева копий
Я бы хотел сделать gradle эквивалент ant функциональности globmapper
<property name="from.dir" location=".."/>
<property name="to.dir" location="dbutil"/>
<copy>
<fileset dir="${from.dir}" ... />
<globmapper from="${from.dir}/*/db" to="${to.dir}"/>
</copy>
Спасибо
Петр
Ответы
Ответ 1
При изменении имени файла переименование кажется хорошим подходом. При изменении пути вы можете переопределить eachFile и изменить путь назначения.
Это работает очень хорошо.
copy {
from("${sourceDir}") {
include 'modules/**/**'
}
into(destDir)
eachFile {details ->
// Top Level Modules
def targetPath = rawPathToModulesPath(details.path)
details.path = targetPath
}
}
....
def rawPathToModulesPath(def path) {
// Standard case modules/name/src -> module-name/src
def modified=path.replaceAll('modules/([^/]+)/.*src/(java/)?(.*)', {"module-${it[1]}/src/${it[3]}"})
return modified
}
Ответ 2
Следующие работы, но есть ли более gradle -ий способ сделать это?
ant.copy(todir: destDir) {
fileset( dir: "${srcDir}/module", includes: '**/src/**')
regexpmapper(from: '^(.*)/src/(.*)$', to: /module-\1\/src\/\2/)
}
Ответ 3
Пожалуйста, смотрите образец ниже. Gradle 4.3 не имеет методов переименования/перемещения, поэтому мы можем выполнять переименование на лету.
Что произошло:
- Загрузите дерево файлов в память. Я использовал zip файл из зависимостей в моем примере
- Элементы фильтра, находящиеся в целевой папке
- Все элементы результата будут иметь один и тот же префикс: если мы будем фильтровать файлы из каталога "A/B/C/", тогда все файлы будут похожи на "A/B/C/file.txt" или "A/B/C/D/file.txt". Например. все они начнутся с одних и тех же слов
- В последнем утверждении everyFile мы изменим окончательное имя, сократив префикс каталога (например, мы вырезаем "A/B/C" ).
- Важно: используйте тип задачи "Копировать", который имеет оптимизацию для инкрементной компиляции. Gradle не будет копировать файл, если все приведенные ниже значения верны:
- Ввод одинаков (для моего случая - всех зависимостей области "nativeDependenciesScope" ) с предыдущей компоновкой
- Ваша функция возвратила те же элементы с предыдущей сборкой
- Папка назначения имеет те же хэш файлы, что и предыдущая сборка
task copyNativeDependencies(type: Copy) {
includeEmptyDirs = false
def subfolderToUse = "win32Subfolder"
def nativePack = configurations.nativeDependenciesScope.singleFile // result - single dependency file
def nativeFiles = zipTree(nativePack).matching { include subfolderToUse + "/*" } // result - filtered file tree
from nativeFiles
into 'build/native_libs'
eachFile {
print(it.path)
// we filtered this folder above, e.g. all files will start from the same folder name
it.path = it.path.replaceFirst("$subfolderToUse/", "")
}
}
// and don't forget to link this task for something mandatory
test.dependsOn(copyNativeDependencies)
run.dependsOn(copyNativeDependencies)