關於build.gradle文件操作

有關其他已翻譯的章節請關注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

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Using a relative path</span>
File configFile = file(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/config.xml'</span>)

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Using an absolute path</span>
configFile = file(configFile.absolutePath)

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Using a File object with a relative path</span>
configFile = file(<span class="hl-keyword" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(221, 196, 152);">new</span> File(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/config.xml'</span>))

您可以把任何對象傳遞給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(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/file1.txt'</span>, <span class="hl-keyword" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(221, 196, 152);">new</span> File(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/file2.txt'</span>), [<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/file3.txt'</span>, <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/file4.txt'</span>])

一個文件集合是可迭代的,並且可以使用as操作符轉換爲其他類型的對象集合。您還可以使用+運算符把兩個文件集合相加,或使用-運算符減去一個文件集合。這裏是一些使用文件集合的例子。

示例 16.3. 使用一個文件集合

build.gradle

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Iterate over the files in the collection</span>
collection.each {File file ->
    println file.name
}

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Convert the collection to various types</span>
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

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Add and subtract collections</span>
def union = collection + files(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/file3.txt'</span>)
def different = collection - files(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/file3.txt'</span>)

你也可以向files()方法傳一個閉包或一個Callable實例。它會在查詢集合內容,並且它的返回值被轉換爲一組文件實例時被調用。這個閉包或Callable實例的返回值可以是files()方法所支持的任何類型的對象。這是 “實現” FileCollection接口的簡單方法。

示例 16.4. 實現一個文件集合

build.gradle

task list << {
    File srcDir

    <span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Create a file collection using a closure</span>
    collection = files { srcDir.listFiles() }

    srcDir = file(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src'</span>)
    println <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">"Contents of $srcDir.name"</span>
    collection.collect { relativePath(it) }.sort().each { println it }

    srcDir = file(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src2'</span>)
    println <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">"Contents of $srcDir.name"</span>
    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

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Create a file tree with a base directory</span>
FileTree tree = fileTree(dir: <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/main'</span>)

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Add include and exclude patterns to the tree</span>
tree.include <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'**/*.java'</span>
tree.exclude <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'**/Abstract*'</span>

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Create a tree using path</span>
tree = fileTree(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src'</span>).include(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'**/*.java'</span>)

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Create a tree using closure</span>
tree = fileTree(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src'</span>) {
    include <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'**/*.java'</span>
}

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Create a tree using a map</span>
tree = fileTree(dir: <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src'</span>, include: <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'**/*.java'</span>)
tree = fileTree(dir: <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src'</span>, includes: [<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'**/*.java'</span>, <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'**/*.xml'</span>])
tree = fileTree(dir: <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src'</span>, include: <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'**/*.java'</span>, exclude: <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'**/*test*/**'</span>)

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

示例 16.6. 使用文件樹

build.gradle

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Iterate over the contents of a tree</span>
tree.each {File file ->
    println file
}

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Filter a tree</span>
FileTree filtered = tree.matching {
    include <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'org/gradle/api/**'</span>
}

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Add trees together</span>
FileTree sum = tree + fileTree(dir: <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/test'</span>)

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Visit the elements of the tree</span>
tree.visit {element ->
    println <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">"$element.relativePath => $element.file"</span>
}

16.4. 使用歸檔文件的內容作爲文件樹

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

示例 16.7. 使用歸檔文件作爲文件樹

build.gradle

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Create a ZIP file tree using path</span>
FileTree zip = zipTree(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'someFile.zip'</span>)

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Create a TAR file tree using path</span>
FileTree tar = tarTree(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'someFile.tar'</span>)

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">//tar tree attempts to guess the compression based on the file extension</span>
<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">//however if you must specify the compression explicitly you can:</span>
FileTree someTar = tarTree(resources.gzip(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'someTar.ext'</span>))

16.5. 指定一組輸入文件

Gradle 中的許多對象都有一個接受一組輸入文件的屬性。例如, JavaCompile任務有一個source屬性,定義了要編譯的源代碼文件。你可以使用上面所示的files()方法所支持的任意類型的對象設置此屬性。這意味着您可以通過如FileString、 集合、 FileCollection對象,或甚至是一個閉包來設置此屬性。這裏有一些例子:

示例 16.8. 指定一組文件

build.gradle

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Use a File object to specify the source directory</span>
compile {
    source = file(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/main/java'</span>)
}

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Use a String path to specify the source directory</span>
compile {
    source = <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/main/java'</span>
}

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Use a collection to specify multiple source directories</span>
compile {
    source = [<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/main/java'</span>, <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'../shared/java'</span>]
}

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Use a FileCollection (or FileTree in this case) to specify the source files</span>
compile {
    source = fileTree(dir: <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/main/java'</span>).matching { include <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'org/gradle/api/**'</span> }
}

<span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Using a closure to specify the source files.</span>
compile {
    source = {
        <span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Use the contents of each zip file in the src dir</span>
        file(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src'</span>).listFiles().findAll {it.name.endsWith(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'.zip'</span>)}.collect { zipTree(it) }
    }
}

通常情況下,有一個與屬性相同名稱的方法,可以追加這個文件集合。再者,這個方法接受files()方法所支持的任何類型的參數。

示例 16.9. 指定一組文件

build.gradle

compile {
    <span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Add some source directories use String paths</span>
    source <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/main/java'</span>, <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/main/groovy'</span>

    <span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Add a source directory using a File object</span>
    source file(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'../shared/java'</span>)

    <span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Add some source directories using a closure</span>
    source { file(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/test/'</span>).listFiles() }
}

16.6. 複製文件

你可以使用Copy任務來複制文件。複製任務非常靈活,並允許您進行,比如篩選要複製的文件的內容,或映射文件的名稱。

若要使用Copy任務,您必須提供用於複製的源文件和目標目錄。您還可以在複製文件的時候指定如何轉換文件。你可以使用一個複製規範來做這些。一個複製規範通過 CopySpec 接口來表示。Copy任務實現了此接口。你可以使用CopySpec.from()方法指定源文件,使用CopySpec.into()方法使用目標目錄。

示例 16.10. 使用copy任務複製文件

build.gradle

task copyTask(type: Copy) {
    from <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/main/webapp'</span>
    into <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'build/explodedWar'</span>
}

from()方法接受和files()方法一樣的任何參數。當參數解析爲一個目錄時,該目錄下的所有文件(不包含目錄本身) 都會遞歸複製到目標目錄。當參數解析爲一個文件時,該文件會複製到目標目錄中。當參數解析爲一個不存在的文件時,參數會被忽略。如果參數是一個任務,那麼任務的輸出文件 (即該任務創建的文件)會被複制,並且該任務會自動添加爲Copy任務的依賴項。into()方法接受和files()方法一樣的任何參數。這裏是另一個示例:

示例 16.11. 指定複製任務的源文件和目標目錄

build.gradle

task anotherCopyTask(type: Copy) {
    <span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Copy everything under src/main/webapp</span>
    from <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/main/webapp'</span>
    <span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Copy a single file</span>
    from <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/staging/index.html'</span>
    <span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Copy the output of a task</span>
    from copyTask
    <span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Copy the output of a task using Task outputs explicitly.</span>
    from copyTaskWithPatterns.outputs
    <span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Copy the contents of a Zip file</span>
    from zipTree(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/main/assets.zip'</span>)
    <span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Determine the destination directory later</span>
    into { getDestDir() }
}

您可以使用 Ant 風格的包含或排除模式,或使用一個閉包,來選擇要複製的文件:

示例 16.12. 選擇要複製的文件

build.gradle

task copyTaskWithPatterns(type: Copy) {
    from <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/main/webapp'</span>
    into <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'build/explodedWar'</span>
    include <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'**/*.html'</span>
    include <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'**/*.jsp'</span>
    exclude { details -> details.file.name.endsWith(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'.html'</span>) && details.file.text.contains(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'staging'</span>) }
}

此外,你也可以使用Project.copy()方法來複制文件。它是與任務一樣的工作方式,儘管它有一些主要的限制。首先, copy()不能進行增量操作(見15.9章節,"跳過處於最新狀態的任務")。

示例 16.13. 使用沒有最新狀態檢查的 copy() 方法複製文件

build.gradle

task copyMethod << {
    copy {
        from <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/main/webapp'</span>
        into <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'build/explodedWar'</span>
        include <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'**/*.html'</span>
        include <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'**/*.jsp'</span>
    }
}

第二,當一個任務用作複製源(即作爲 from() 的參數)的時候,copy()方法不能建立任務依賴性,因爲它是一個方法,而不是一個任務。因此,如果您在任務的action裏面使用copy()方法,必須顯式聲明所有的輸入和輸出以得到正確的行爲。

示例 16.14. 使用有最新狀態檢查的 copy() 方法複製文件

build.gradle

task copyMethodWithExplicitDependencies{
    inputs.file copyTask <span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// up-to-date check for inputs, plus add copyTask as dependency</span>
    outputs.dir <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'some-dir'</span> <span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// up-to-date check for outputs</span>
    doLast{
        copy {
            <span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Copy the output of copyTask</span>
            from copyTask
            into <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'some-dir'</span>
        }
    }
}

在可能的情況下,最好是使用Copy任務,因爲它支持增量構建和任務依賴關係推理,而不需要你額外付出。copy()方法可以作爲一個任務執行的部分來複制文件。即,這個copy()方法旨在用於自定義任務 (見第 57 章,編寫自定義任務類)中,需要文件複製作爲其一部分功能的時候。在這種情況下,自定義任務應充分聲明與複製操作有關的輸入/輸出。

16.6.1. 重命名文件

示例 16.15. 重命名複製的文件

build.gradle

task rename(type: Copy) {
    from <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/main/webapp'</span>
    into <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'build/explodedWar'</span>
    <span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Use a closure to map the file name</span>
    rename { String fileName ->
        fileName.replace(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'-staging-'</span>, <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">''</span>)
    }
    <span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Use a regular expression to map the file name</span>
    rename <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'(.+)-staging-(.+)'</span>, <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'$1$2'</span>
    rename(/(.+)-staging-(.+)/, <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'$1$2'</span>)
}

16.6. 過濾文件

示例 16.16. 過濾要複製的文件

build.gradle

<span class="hl-keyword" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(221, 196, 152);">import</span> org.apache.tools.ant.filters.FixCrLfFilter
<span class="hl-keyword" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(221, 196, 152);">import</span> org.apache.tools.ant.filters.ReplaceTokens

task filter(type: Copy) {
    from <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/main/webapp'</span>
    into <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'build/explodedWar'</span>
    <span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Substitute property references in files</span>
    expand(copyright: <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'2009'</span>, version: <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'2.3.1'</span>)
    expand(project.properties)
    <span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Use some of the filters provided by Ant</span>
    filter(FixCrLfFilter)
    filter(ReplaceTokens, tokens: [copyright: <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'2009'</span>, version: <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'2.3.1'</span>])
    <span class="hl-comment" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(175, 175, 175);">// Use a closure to filter each line</span>
    filter { String line ->
        <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">"[$line]"</span>
    }
}

16.6.3. 使用CopySpec

複製規範用來組織一個層次結構。一個複製規範繼承其目標路徑,包含模式,排除模式,複製操作,名稱映射和過濾器。

示例 16.17. 嵌套的複製規範

build.gradle

task nestedSpecs(type: Copy) {
    into <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'build/explodedWar'</span>
    exclude <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'**/*staging*'</span>
    from(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/dist'</span>) {
        include <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'**/*.html'</span>
    }
    into(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'libs'</span>) {
        from configurations.runtime
    }
}

16.7. 使用Sync任務

Sync任務繼承了Copy任務。當它執行時,它會將源文件複製到目標目錄中,然後從目標目錄移除所有不是它複製的文件。這可以用來做一些事情,比如安裝你的應用程序、 創建你的歸檔文件的exploded副本,或維護項目的依賴項的副本。

這裏是一個例子,維護在build/libs目錄中的項目運行時依賴的副本。

示例 16.18. 使用同步任務複製依賴項

build.gradle

task libs(type: Sync) {
    from configurations.runtime
    into <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">"$buildDir/libs"</span>
}

16.8. 創建歸檔文件

一個項目可以有你所想要的一樣多的 JAR 文件。您也可以將WAR、 ZIP 和TAG文件添加到您的項目。使用各種歸檔任務可以創建以下的歸檔文件: ZipTarJarWar, and Ear. 他們的工作方式都一樣,所以讓我們看看如何創建一個 ZIP 文件。

示例 16.19. 創建一個 ZIP 文件

build.gradle

apply plugin: <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'java'</span>

task zip(type: Zip) {
    from <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src/dist'</span>
    into(<span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'libs'</span>) {
        from configurations.runtime
    }
}

爲什麼要用 Java 插件?

Java 插件對歸檔任務添加了一些默認值。如果你願意,使用歸檔任務時可以不需要Java插件。您需要提供一些值給附加的屬性。

歸檔任務與Copy任務的工作方式一樣,並且實現了相同的CopySpec接口。像使用Copy任務一樣,你需要使用from() 的方法指定輸入的文件,並可以選擇是否通過 into() 方法指定最終在存檔中的位置。您可以通過一個複製規範來篩選文件的內容、 重命名文件和進行其他你可以做的事情。

16.8.1. 歸檔命名

生成的歸檔的默認名稱是projectName-version.type。舉個例子:

示例 16.20. 創建 ZIP 文件

build.gradle

apply plugin: <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'java'</span>

version = <span class="hl-number" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">1.0</span>

task myZip(type: Zip) {
    from <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'somedir'</span>
}

println myZip.archiveName
println relativePath(myZip.destinationDir)
println relativePath(myZip.archivePath)

gradle -q myZip 的輸出結果

> gradle -q myZip
zipProject-1.0.zip
build/distributions
build/distributions/zipProject-1.0.zip

它添加了一個名稱爲myZipZIP歸檔任務,產生 ZIP 文件 zipProject 1.0.zip。區分歸檔任務的名稱和歸檔任務生成的歸檔文件的名稱是很重要的。歸檔的默認名稱可以通過項目屬性 archivesBaseName 來更改。還可以在以後的任何時候更改歸檔文件的名稱。

這裏有很多你可以在歸檔任務中設置的屬性。它們在以下的表 16.1,"存檔任務-命名屬性"中列出。你可以,比方說,更改歸檔文件的名稱:

示例 16.21. 配置歸檔任務-自定義歸檔名稱

build.gradle

apply plugin: <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'java'</span>
version = <span class="hl-number" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">1.0</span>

task myZip(type: Zip) {
    from <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'somedir'</span>
    baseName = <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'customName'</span>
}

println myZip.archiveName

gradle -q myZip 的輸出結果

> gradle -q myZip
customName-1.0.zip

您可以進一步自定義存檔名稱:

示例 16.22. 配置歸檔任務 - appendix & classifier

build.gradle

apply plugin: <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'java'</span>
archivesBaseName = <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'gradle'</span>
version = <span class="hl-number" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">1.0</span>

task myZip(type: Zip) {
    appendix = <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'wrapper'</span>
    classifier = <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'src'</span>
    from <span class="hl-string" style="box-sizing: border-box; margin: 0px; padding: 0px; font-family: inherit; font-weight: inherit; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: rgb(131, 194, 131);">'somedir'</span>
}

println myZip.archiveName

gradle -q myZip 的輸出結果

> gradle -q myZip
gradle-wrapper-1.0-src.zip

表 16.1. 歸檔任務-命名屬性

屬性名稱 類型 默認值 描述
archiveName String baseName-appendix-version-classifier.extension

如果這些屬性中的任何一個爲空,那後面的-不會被添加到該名稱中。

生成的歸檔文件的基本文件名
archivePath File destinationDir/archiveName 生成的歸檔文件的絕對路徑。
destinationDir File 依賴於歸檔類型。JAR包和 WAR包會生成到 project.buildDir/libraries中。ZIP文件和 TAR文件會生成到project.buildDir/distributions中。 存放生成的歸檔文件的目錄
baseName String project.name 歸檔文件的名稱中的基本名稱部分。
appendix String null 歸檔文件的名稱中的附錄部分。
version String project.version 歸檔文件的名稱中的版本部分。
classifier String null 歸檔文件的名稱中的分類部分。
extension String 依賴於歸檔的類型,用於TAR文件,可以是以下壓縮類型: zipjarwartartgz or tbz2. 歸檔文件的名稱中的擴展名稱部分。

16.8.2. 共享多個歸檔之間的內容

你可以使用Project.copySpec()方法在歸檔之間共享內容。

你經常會想要發佈一個歸檔文件,這樣就可從另一個項目中使用它。這一過程在第 51章,發佈文件中會講到。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章