1. 程式人生 > >Gradle 1.12 翻譯——第十六章. 使用檔案

Gradle 1.12 翻譯——第十六章. 使用檔案

有關其他已翻譯的章節請關注Github上的專案:https://github.com/msdx/gradledoc/tree/1.12,或訪問:http://gradledoc.qiniudn.com/1.12/userguide/userguide.html

本文原創,轉載請註明出處:http://blog.csdn.net/maosidiaoxian/article/details/41113353

關於我對Gradle的翻譯,以Github上的專案及http://gradledoc.qiniudn.com 上的文件為準。如有發現翻譯有誤的地方,將首先在以上兩個地方更新。因時間精力問題,部落格中發表的譯文基本不會同步修改。

第十六章. 使用檔案

大多數構建工作都要使用到檔案。Gradle 添加了一些概念和 API 來幫助您實現這一目標。

16.1. 定位檔案

你可以使用Project.file()方法來找到一個相對於專案目錄的檔案 。

示例 16.1. 查詢檔案

build.gradle

// Using a relative path
File configFile = file('src/config.xml')

// Using an absolute path
configFile = file(configFile.absolutePath)

// Using a File object with a relative path
configFile = file(new File('src/config.xml'))

您可以把任何物件傳遞給file()方法,而它將嘗試將其轉換為一個絕對路徑的File物件。通常情況下,你會傳給它一個StringFile的例項。而所提供的這個物件的tostring()方法的值會作為檔案路徑。如果這個路徑是一個絕對路徑,它會用於構構一個File例項。否則,會通過先計算所提供的路徑相對於專案目錄的相對路徑來構造File例項。這個file ()方法也可以識別URL,例如是file:/some/path.xml

這是把一些使用者提供的值轉換為一個相對路徑的File物件的有用方法。由於file()

方法總是去計算所提供的路徑相對於專案目錄的路徑,最好是使用new File(somePath),因為它是一個固定的路徑,而不會因為使用者執行Gradle的具體工作目錄而改變。

16.2..檔案集合

一個檔案集合只是表示一組檔案。它通過FileCollection介面來表示。Gradle API 中的許多物件都實現了此介面。比如,依賴配置 就實現了 FileCollection 這一介面。

使用Project.files()方法是獲取一個FileCollection例項的其中一個方法。你可以向這個方法傳入任意個物件,而它們會被轉換為一組 File 物件。這個Files()方法接受任何型別的物件作為其引數。根據16.1 章節 “定位檔案”裡對file()方法的描述,它的結果會被計算為相對於專案目錄的相對路徑。你也可以將集合,迭代變數,map和陣列傳遞給files()方法。它們會被展開,並且內容會轉換為 File 例項。

示例 16.2. 建立一個檔案集合

build.gradle

FileCollection collection = files('src/file1.txt', new File('src/file2.txt'), ['src/file3.txt', 'src/file4.txt'])

一個檔案集合是可迭代的,並且可以使用as操作符轉換為其他型別的物件集合。您還可以使用+運算子把兩個檔案集合相加,或使用-運算子減去一個檔案集合。這裡是一些使用檔案集合的例子。

示例 16.3. 使用一個檔案集合

build.gradle

// Iterate over the files in the collection
collection.each {File file ->
    println file.name
}

// Convert the collection to various types
Set set = collection.files
Set set2 = collection as Set
List list = collection as List
String path = collection.asPath
File file = collection.singleFile
File file2 = collection as File

// Add and subtract collections
def union = collection + files('src/file3.txt')
def different = collection - files('src/file3.txt')

你也可以向files()方法傳一個閉包或一個Callable例項。它會在查詢集合內容,並且它的返回值被轉換為一組檔案例項時被呼叫。這個閉包或Callable例項的返回值可以是files()方法所支援的任何型別的物件。這是 “實現” FileCollection介面的簡單方法。

示例 16.4. 實現一個檔案集合

build.gradle

task list << {
    File srcDir

    // Create a file collection using a closure
    collection = files { srcDir.listFiles() }

    srcDir = file('src')
    println "Contents of $srcDir.name"
    collection.collect { relativePath(it) }.sort().each { println it }

    srcDir = file('src2')
    println "Contents of $srcDir.name"
    collection.collect { relativePath(it) }.sort().each { println it }
}

gradle -q list的輸出結果

> gradle -q list
Contents of src
src/dir1
src/file1.txt
Contents of src2
src2/dir1
src2/dir2

你可以向files()傳入一些其他型別的物件:

FileCollection

它們會被展開,並且內容會被包含在檔案集合內。

Task

任務的輸出檔案會被包含在檔案集合內。

TaskOutputs

TaskOutputs 的輸出檔案會被包含在檔案集合內。

要注意的一個地方是,一個檔案集合的內容是緩計算的,它只在需要的時候才計算。這意味著您可以,比如建立一個FileCollection 物件而裡面的檔案會在以後才建立,比方說在一些任務中才建立。

16.3. 檔案樹

檔案樹是按層次結構排序的檔案集合。例如,檔案樹可能表示一個目錄樹或 ZIP 檔案的內容。它通過FileTree介面表示。FileTree介面繼承自FileCollection,所以你可以用對待檔案集合一樣的方式來對待檔案樹。Gradle 中的幾個物件都實現了FileTree介面,例如source sets

使用Project.fileTree()方法是獲取一個FileTree例項的其中一種方法。它將定義一個基目錄建立FileTree物件,並可以選擇加上一些 Ant風格的包含與排除模式。

示例 16.5. 建立一個檔案樹

build.gradle

// Create a file tree with a base directory
FileTree tree = fileTree(dir: 'src/main')

// Add include and exclude patterns to the tree
tree.include '**/*.java'
tree.exclude '**/Abstract*'

// Create a tree using path
tree = fileTree('src').include('**/*.java')

// Create a tree using closure
tree = fileTree('src') {
    include '**/*.java'
}

// Create a tree using a map
tree = fileTree(dir: 'src', include: '**/*.java')
tree = fileTree(dir: 'src', includes: ['**/*.java', '**/*.xml'])
tree = fileTree(dir: 'src', include: '**/*.java', exclude: '**/*test*/**')

你可以像使用一個檔案集合的方式一樣來使用一個檔案樹。你也可以使用Ant風格的模式來訪問檔案樹的內容或選擇一個子樹:

示例 16.6. 使用檔案樹

build.gradle

// Iterate over the contents of a tree
tree.each {File file ->
    println file
}

// Filter a tree
FileTree filtered = tree.matching {
    include 'org/gradle/api/**'
}

// Add trees together
FileTree sum = tree + fileTree(dir: 'src/test')

// Visit the elements of the tree
tree.visit {element ->
    println "$element.relativePath => $element.file"
}

16.4. 使用歸檔檔案的內容作為檔案樹

您可以使用檔案的內容,如 ZIP 或者 TAR 檔案,作為一個檔案樹。你可以通過使用Project.zipTree()Project.tarTree()方法來實現這一過程。這些方法返回一個FileTree例項,您可以像使用任何其他檔案樹或檔案集合一樣使用它。例如,您可以用它來通過複製內容擴大歸檔,或把一些檔案合併到另一個歸檔檔案中。

示例 16.7. 使用歸檔檔案作為檔案樹

build.gradle

// Create a ZIP file tree using path
FileTree zip = zipTree('someFile.zip')

// Create a TAR file tree using path
FileTree tar = tarTree('someFile.tar')

//tar tree attempts to guess the compression based on the file extension
//however if you must specify the compression explicitly you can:
FileTree someTar = tarTree(resources.gzip('someTar.ext'))

16.5. 指定一組輸入檔案

Gradle 中的許多物件都有一個接受一組輸入檔案的屬性。例如, JavaCompile任務有一個source屬性,定義了要編譯的原始碼檔案。你可以使用上面所示的files()方法所支援的任意型別的物件設定此屬性。這意味著您可以通過如FileString、 集合、 

相關推薦

Gradle 1.12 翻譯——. 使用檔案

有關其他已翻譯的章節請關注Github上的專案:https://github.com/msdx/gradledoc/tree/1.12,或訪問:http://gradledoc.qiniudn.com/1.12/userguide/userguide.html

演算法導論習題16.1-2

從最後一個開始的活動開始選擇,則各個活動開始時間要進行排序。程式碼如下: //貪心演算法 #include<iostream> using namespace std; //選擇最先結束的活動 int GreedySelect(int *s,int *f,int

Introduction to 3D Game Programming with DirectX 12 學習筆記之 --- :實例化和截頭錐體裁切

srv 參數 linear clam 階段 res lease log multiple 原文:Introduction to 3D Game Programming with DirectX 12 學習筆記之 --- 第十六章:實例化和截頭錐體裁切

【MySQL必知必會】 創建高級聯結

類型 where子句 contact items order by 其他 mysq custom 必知必會 1、使用表別名   好處:   a、縮短SQL語句。   b、允許在單條SELECT語句中多次使用相同的表。   輸入:   SELECT  cust_name,cu

-進程和線程

lan 進程 命名 永遠 大小 無法使用 inux wait 沒有 對於操作系統來說, 一個任務就是一個進程(Process) 進程內的這些“子任務”稱為線程(Thread) 真正的並行執行多任務只能在多核CPU上實現 多任務的實現有3種方式:

算法導論筆記—— 貪心算法

一個 出現 預處理 優化 節點 求解 多選 數據結構 集中 通常用於最優化問題,我們做出一組選擇來達到最優解。每步都追求局部最優。對很多問題都能求得最優解,而且速度比動態規劃方法快得多。 16.1 活動選擇問題 按結束時間排序,然後選擇兼容活動。 定理16.1 考慮任意

沒有銀彈 ---軟件工程中的根本和次要問題

測試 未來 接收 增長 ada tail 進行 tro 困難 http://blog.csdn.net/zuochao_2013/article/details/73614151 在未來的十年內,無論是在技術還是管理方法上,都看不出有任何突破性的進步,能夠保證在十年內大幅度

進擊的Python【】:Web前端基礎之jQuery

name cat 隱藏 function wid get val 綁定 des 進擊的Python【第十六章】:Web前端基礎之jQuery 一、什麽是 jQuery ? jQuery是一個JavaScript函數庫。 jQuery是一個輕量級的"寫的少,做的多"的Java

從零開始的linux

rm -rf /* glob通配符的用法詳解從零開始的linux 第十六章路人乙:“啊,小編你越來越過分了,這次居然推遲了一天才來!!”(嬉皮笑臉)嘻嘻~~抱歉啦同學們,小編昨天因為做LNMP以及負載均衡的DR工作模式的時候出了點小問題,原理部分與小編理解的有點誤差~~不過小編這麽厲害肯定是已經解決

算法導論

LG ted sum 不能 復雜度 selector else n-1 greedy 16.1 16.1-1 int c[n+1][n+1]; int b[n+1][n+1]; for (int i = 0; i <= n; i++) { for (int j =

java基礎 (連接數據庫)

ID 循環 exec manage () result creat AS 新的 連接數據庫(JDBC接口) 步驟如下: 先到數據庫jar包。 1.加載驅動 Class.forName("包路徑"); 例:Class.forName("com.mysql.jd

在文件中搜索文本工具:grep命令 和egrep命令

oot his a-z 多個 查找 sea 內容 args lar 第十六章 在文件中搜索文本工具:grep命令 和egrep命令 名詞解釋 grep(global search regular expression(RE)and print out the line,全面

創建高級聯結

sql where 們的 卡爾 類型 不同 custom 可能 工作 學習目的: 了解另外一些聯結類型,包括它們的含義和使用方法,如何對被聯結的表使用別名和聚集函數。 使用表別名: 別名除了用於列名和計算字段外,SQL還允許給表名起別名。這樣做主要有兩個理由: 縮短S

【練習題】--類和函式(Think Python)

class Time: hour=0 minute=0 second=0 def print_time(t): print("%.2d:%.2d:%.2d"%(t.hour,t.minute,t.second)) def is_after(t1,t2):

強化學習(RLAI)讀書筆記Applications and Case Studies(alphago)

強化學習(RLAI)讀書筆記第十六章Applications and Case Studies(alphago) 16.6 Mastering the Game of Go 16.6.1 AlphaGo 16.6.2 AlphaG

強化學習(RLAI)讀書筆記Applications and Case Studies(不含alphago)

強化學習(RLAI)讀書筆記第十六章Applications and Case Studies(不含alphago) 16.1 TD-Gammon 16.2 Samuel's Checkers Player 16.3 Watson‘s Dail

c++ primer 習題

c++ primer 第十六章習題 練習16.1 例項化是指傳遞給模板相應的模板引數,使其生成對應型別的函式體或是型別定義。 練習16.2 #include <iostream> #include <string> #include

《Linux Device Drivers》 塊裝置驅動程式——note

簡介 一個塊裝置驅動程式主要通過傳輸固定大小的隨機資料來訪問裝置 Linux核心視塊裝置為與字元裝置相異的基本裝置型別 Linux塊裝置驅動程式介面使得塊裝置可以發揮其最大的功效,但是其複雜程式又是程式設計者必須面對的一個問題 一個數據塊指的是固

《java程式設計思想》 陣列

16.1 陣列為什麼特殊 (1)出現泛型之前: 陣列與其他種類的容器之間的區別有三方面:效率、型別和儲存基本型別的能力。 (2)泛型之後: 泛型的出現使得容器也具備了型別檢查的能力,而自動裝箱機制使容器可以與陣列幾乎一模一樣的用於基本型別,陣列的碩果僅存的優點就是效率。

C++學習筆記——C++ Primer Plus中文STL程式設計練習解答

發現答案資源不全,因此貼出自己的解答,都為STL應用基礎題,如有謬誤,還請不吝賜教。 第一題 要求:迴文字串判斷(假定字串中沒有大小寫、空格、標點符號等問題) 解答: #include<iostream> #include<string>