2012-11-08 37 views
13

複製時可以修改樹的結構嗎?複製樹與gradle和更改結構?

原始

  • MOD /一個/ SRC
  • 模/ B/SRC

期望

  • DEST/MOD-A /源
  • DEST/MOD-B /源
  • DEST/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> 

感謝

彼得

回答

21

更改文件名時,重命名似乎是一種好方法。更改路徑時,您可以覆蓋每個文件並修改目標路徑

這工作得很好。

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

這個爲我工作,但它也創建了原始目錄,它們仍然是空的。 – peez80

+2

嘗試設置'setIncludeEmptyDirs(false)' – thetwan

+3

如果只想保留文件名並將其放到目標目錄中,'details.path = details.name' – wrossmck

1

下面的工作,但有沒有更多的gradle-ish方式來做到這一點?

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

爲什麼我們不能用'globmapper'? –

+0

大概可以。也許這是一個更真實的gradle方法。有一個例子嗎? –

0

請參閱下面的示例。 Gradle 4.3沒有重命名/移動方法,所以我們可以在飛行中重命名。

什麼事情發生了:

  1. 加載文件樹到內存中。我在示例中使用了依賴關係中的zip文件
  2. 篩選項目在目標文件夾中
  3. 所有結果項都具有相同的前綴:如果我們從目錄「A/B/C /」篩選文件,則全部文件將類似於「A/B/C/file.txt」或「A/B/C/D/file.txt」。例如。我們將通過剪切目錄前綴(例如,我們將剪切「A/B/C」)來改變最終名稱。所有這些都將以相同的單詞開始
  4. 在最後的聲明eachFile
  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)