1. 程式人生 > >Gradle基本使用(5):檔案操作

Gradle基本使用(5):檔案操作

檔案集合的遍歷
1
collection.each {File file ->
2
    println file.name
3
 }
檔案集合可以進行合併、排除等集合操作,如下: 1
FileCollection collection = files { file('src').listFiles() }
2
def union = collection  + files('./file1.txt');           //合併操作
3
def different = collection - files('src/file1.txt'
);      //排除操作

檔案樹

檔案樹是按層次結構排序的檔案集合,使用 FileTree 介面(繼承自 FileCollection 介面),檔案樹可能表示一個目錄樹或 ZIP 檔案的內容;
建立檔案樹 1
//方式1:使用一個基本目錄建立
2
FileTree tree = fileTree(dir: 'src/main')
3
tree.include '**/*.java'           //向檔案樹新增檔案
4
tree.exclude '**/Abstract*'        //從檔案樹排除檔案
5 6
//方式2:可以對方式1實現鏈式呼叫
7
FileTree tree = fileTree(dir: 'src/main').include('**/*.java').exclude('**/Abstract*')
8 9
//方式3:使用map建立
10
FileTree tree = fileTree(dir: 'src', include: '**/*.java', exclude: '**/*test*/**')  
11
FileTree tree = fileTree(dir: 'src', include: ['**/*.java','**/*.xml'] exclude: '**/*test*/**'
)      
使用檔案樹 1
//遍歷檔案樹
2
tree.each {File file ->
3
    println file
4
}
5
6
//過濾檔案樹
7
FileTree filtered = tree.matching {
8
    include 'org/gradle/api/**'
9
    exclude '**/Abstract*' 
10
}
11
12
//合併檔案樹
13
FileTree sum = tree + fileTree(dir: 'src/test')
建立 ZIP、TAR 等檔案歸檔的檔案樹 1
FileTree zip = zipTree('someFile.zip')
2
FileTree tar = tarTree('someFile.tar')

複製檔案 

複製檔案 gradle 提供了 copy type 的 task api 用於實現簡便的檔案複製,基本使用如下: 1
task copyTask(type: Copy) {
2
    from 'src/main/webapp'
3
    into 'build/explodedWar'
4
}  
from,into 方法都可以接收 檔案字串型別引數,file物件,FileCollection物件,FileTree 物件,task返回引數等;
其中 form 引數可以有多個,可以是一般的檔案,目錄,ZIP、TAR等檔案歸檔,如下: 1
task anotherCopyTask(type: Copy) {
2
    from 'src/main/webapp'
3
    from 'src/staging/index.html'
4
    from task3
5
    from copyTaskWithPatterns.outputs
6
    from zipTree('src/main/assets.zip')
7
    into { getDestDir() }
8
}  
同時在複製過程中可以對檔案進行篩選 1
task copyTaskWithPatterns(type: Copy) {
2
    from 'src/main/webapp'
3
    into 'build/explodedWar'
4
    include '**/*.html'
5
    include '**/*.jsp'
6
    exclude { details -> details.file.name.endsWith('.html') && details.file.text.contains('staging') }  
7
    //其中exclude使用了一個閉包作為引數,details引數代指複製過程中的file
8
}  
重新命名檔案 1
task rename(type: Copy) {
2
    from 'src/main/webapp'
3
    into 'build/explodedWar'
4 5
    //使用閉包作為引數
6
    rename { String fileName ->
7
        fileName.replace('-staging-', '')
8
    }
9
    //使用正則表示式作為引數
10
    rename '(.+)-staging-(.+)', '$1$2'
11
}