14

gradle 可以在复制时改变树的结构吗?

原来的

  • 模组/a/src
  • 模组/b/src

想要的

  • 目标/mod-a/源
  • 目标/mod-b/源
  • 目标/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>

谢谢

彼得

4

3 回答 3

24

更改文件名时,重命名似乎是一个好方法。更改路径时,您可以覆盖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
}
于 2012-11-09T22:25:26.933 回答
2

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

发生了什么:

  1. 将文件树加载到内存中。我在示例中使用了依赖项中的 zip 文件
  2. 筛选项目,位于目标文件夹中
  3. 所有结果项都将具有相同的前缀:如果我们从目录“A/B/C/”过滤文件,那么所有文件将类似于“A/B/C/file.txt”或“A/B/C/D” /file.txt”。例如,所有这些都将以相同的单词开头
  4. 在每个文件的最后一条语句中,我们将通过剪切目录前缀来更改最终名称(例如,我们将剪切“A/B/C”)。
  5. 重要提示:使用任务类型“复制”,它对增量编译进行了优化。如果以下所有项目都为真,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)
于 2017-11-09T18:28:28.493 回答
1

以下工作,但有没有更gradle-ish的方式来做到这一点?

    ant.copy(todir: destDir) {
      fileset( dir: "${srcDir}/module", includes: '**/src/**')
      regexpmapper(from: '^(.*)/src/(.*)$', to: /module-\1\/src\/\2/)
    }
于 2012-11-08T20:49:56.243 回答