复制树与gradle和改变结构?

时间:2012-11-08 20:12:03

标签: gradle build copy rename

复制时是否可以改变树的结构?

原始

  • MOD /一个/ SRC
  • MOD / B / SRC

期望的

  • DEST / MOD-A /源
  • DEST / MOD-B /源
  • DEST / MOD-C /源

我不确定在哪里创建闭包并覆盖复制树逻辑

我想做与ant的globmapper功能相当的gradle

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

由于

彼得

3 个答案:

答案 0 :(得分:21)

更改文件名时,重命名似乎是一种很好的方法。更改路径时,您可以覆盖 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
}

答案 1 :(得分:1)

以下是有效的,但有更多的方法可以做到这一点吗?

    ant.copy(todir: destDir) {
      fileset( dir: "${srcDir}/module", includes: '**/src/**')
      regexpmapper(from: '^(.*)/src/(.*)$', to: /module-\1\/src\/\2/)
    }

答案 2 :(得分:1)

请参阅下面的示例。 Gradle 4.3没有重命名/移动方法,所以我们可以动态重命名。

发生了什么:

  1. 将文件树加载到内存中。我在我的示例
  2. 中使用了依赖项的zip文件
  3. 过滤目标文件夹中的项目
  4. 所有结果项都将具有相同的前缀:如果我们从目录“A / B / C /”中过滤文件,那么所有文件将类似于“A / B / C / file.txt”或“A / B /” C / d / file.txt的”。例如。所有这些都将以相同的词开头
  5. 在最后一个语句 eachFile 中,我们将通过剪切目录前缀来更改最终名称(例如,我们将剪切“A / B / C”)。
  6. 重要事项:使用任务类型“复制”,它具有增量编译的优化功能。如果以下所有项目都为真,Gradle将不会进行文件复制:
    • 输入是相同的(对于我的情况 - 范围的所有依赖关系“nativeDependenciesScope”)与之前的构建
    • 您的函数返回与上一版本相同的项目
    • 目标文件夹具有与之前版本
    • 相同的文件哈希值
  7. 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)