复制树gradle这个和改变结构?(copy tree with gradle and change

2019-08-02 12:00发布

可以摇篮改变树的结构,同时复制?

原版的

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

期望

  • / MOD /源
  • / MOD-B /源
  • / MOD-C /源

我不知道我应该创建一个封闭,并覆盖副本树逻辑

我想这样做的蚂蚁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>

谢谢

彼得

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


Answer 2:

下面的工作,但有一个更gradle这个十岁上下的方式来做到这一点?

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


Answer 3:

请看下面的示例。 摇篮4.3没有重命名/移动的方法,这样我们就可以在飞行中不重命名。

什么事情发生了:

  1. 加载文件树到内存中。 我以前从依赖zip文件在我的例子
  2. 筛选项目,这是在目标文件夹
  3. 所有的结果项目将具有相同的前缀:如果我们过滤掉目录中的文件 “A / B / C /”,那么所有文件会像 “A / B / C / file.txt的” 或“A / B / C / d /file.txt”。 例如,他们都将开始使用同样的话
  4. 在最后的陈述eachFile我们将通过削减目录前缀改变最终的名称(例如,我们将削减“A / B / C”)。
  5. 重要提示:使用任务类型“复制”,这对渐进式编译优化。 摇篮不会做的文件复制如果所有项目的以下为真:
    • 输入是相同的(我的情况 - 范围“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)


文章来源: copy tree with gradle and change structure?