Подтвердить что ты не робот

Скопировать дерево с помощью gradle и изменить структуру?

Может ли gradle изменить структуру дерева при копировании?

оригинальный

  • модник/а/ЦСИ
  • мод/б/SRC

желаемый

  • 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>

Спасибо

Петр

4b9b3361

Ответ 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)