Gradle是以Groovy語言爲基礎,基於DSL語法的自動化構建工具,一個構建腳本可以包含任何Groovy語言元素,每一個腳本都是UTF-8編碼的文件。html
前面咱們說過,Gradle在構建腳本中定義了一個project,對於構建腳本中每一個project其實Gradle都建立了一個 Project類型的對象來關聯,當構建腳本執行時它會去配置所關聯的Project對象;構建腳本中每一個被調用的方法和屬性都委託給了當前Project對象。java
以下咱們看一個使用Project屬性的例子:git
println name println project.name
上面兩個println語句的輸出是同樣的;因爲name屬性沒有在當前腳本中定義,因此能夠像第一個那樣使用自動委託 ,一般咱們使用第二中寫法。github
Project對象提供了一些標準的屬性,咱們能夠在構建腳本中很方便的使用他們,以下:web
Name | Type | Default Value |
---|---|---|
project | Project | Project實例對象 |
name | String | 項目目錄的名稱 |
path | String | 項目的絕對路徑 |
description | String | 項目描述 |
projectDir | File | 包含構建腳本的目錄 |
build | File | projectDir/build |
group | Object | 未具體說明 |
version | Object | 未具體說明 |
ant | AntBuilder | Ant實例對象 |
具體關於Project的方法詳情參閱Project的API文檔。這裏咱們給出Project的apply方法的一個例子,以下:正則表達式
//加載一個gradle文件 apply from: rootProject.getRootDir().getAbsolutePath() + "/common.gradle"
當Gradle執行一個腳本時它會將這個腳本編譯爲實現了Script的類(在上篇博客《Groovy腳本基礎全攻略》Groovy的本質編譯class代碼那塊有介紹),也就是說全部的屬性和方法都是在Script的接口中聲明。spring
關於Gradle對象的詳細屬性和API介紹點我便可。這裏直接給出一個使用Gradle對象的例子,以下:api
在Gradle腳本中有兩種類型的變量能夠聲明,以下:bash
局部變量使用關鍵字def聲明,它只在聲明的地方可見,以下:閉包
def dest = "dest" task copy(type: Copy) { form "source" into dest }
在Gradle中全部被加強的對象能夠擁有自定義屬性(譬如projects、tasks、source sets等),使用ext擴展塊能夠一次添加多個屬性。以下:
apply plugin: "java" ext { springVersion = "3.1.0.RELEASE" emailNotification = "build@master.org" } sourceSets.all { ext.purpose = null } sourceSets { main { purpose = "production" } test { purpose = "test" } plugin { purpose = "production" } } task printProperties << { println springVersion println emailNotification sourceSets.matching { it.purpose == "production" }.each { println it.name} }
上面咱們用一個ext擴展塊向Project對象添加兩個擴展屬性,當這些擴展屬性被添加後,它們就像預約義的屬性同樣能夠被讀寫。
這個沒啥說的,具體能夠參考《Groovy腳本基礎全攻略》這篇博客,裏面有詳細介紹。咱們這裏粗略總結回憶一下便可:
Groovy會自動將一個屬性的引用轉換爲相應的getter/setter方法。
Groovy調用方法時圓括號無關緊要。
Groovy爲List和Map集合提供了一些操做捷徑,譬如apply plugin:’java’中的plugin:’java’其實就是Groovy中的Map,apply是一個方法,省略了括弧而已。
哎呀,詳細的仍是去看前一篇博客吧。
【工匠若水 http://blog.csdn.net/yanbober 轉載請註明出處。點我開始Android技術交流】
實際使用Gradle過程當中大多數時候須要操做文件,好在Gradle給咱們提供了一些API來快捷處理。
定位文件:
咱們可使用Project.file()方法來定位一個文件獲取File對象(詳情參考Project的API),以下:
//相對路徑 File configFile = file('src/config.xml') //絕對路徑 File configFile = file(configFile.absolutePath) //項目路徑的文件對象 File configFile = file(new File('src/config.xml'))
能夠從Project的API發現file()方法可以接收任何形式的對象參數,它會將參數值轉換爲一個絕對文件對象,一般咱們能夠傳一個String或File實例;若是傳的路徑是絕對路徑,則會被直接構造爲一個文件實例,不然會被構造爲項目目錄加上傳遞目錄的文件對象;固然了,file()方法還能識別URL(譬如file:/some/path.xml等)。
文件集合:
文件集合實際上是一組文件,Gradle使用FileCollection接口表示文件集合,Gradle API中許多類都實現了這個接口,譬如dependency configurations等。獲取FileCollection實例的一種方法是Project.files(),咱們能夠傳遞任何數量的對象參數。以下:
FileCollection collection = files('src/file1.txt', new File('src/file2.txt'), ['src/file3.txt', 'src/file4.txt'])
使用迭代操做還能將其轉換爲其餘的一些類型,同時咱們還可使用+操做將兩個文件集合合併,使用-操做對一個文件集合作減法。以下例子:
// 對文件集合進行迭代
collection.each {File file -> println file.name } // 轉換文件集合爲其餘類型 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 // 增長和減小文件集合 def union = collection + files('src/file3.txt') def different = collection - files('src/file3.txt')
咱們也能夠向files()方法傳遞閉包或者可回調的實例參數,當查詢集合的內容時就會調用它,而後將返回值轉換爲一些文件實例,返回值能夠是files()方法支持的任何類型的對象。以下例子:
task list << {
File srcDir
// 使用閉合建立一個文件集合 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 } }
文件樹:
文件樹能夠表明一個目錄樹結構或一個ZIP壓縮文件的內容,FileTree繼承自FileCollection,因此咱們能夠像處理文件集合同樣處理文件樹,使用Project.fileTree()方法能夠獲得FileTree實例,它會建立一個基於基準目錄的對象。以下:
/以一個基準目錄建立一個文件樹
FileTree tree = fileTree(dir: 'src/main') // 添加包含和排除規則 tree.include '**/*.java' tree.exclude '**/Abstract*' // 使用路徑建立一個樹 tree = fileTree('src').include('**/*.java') // 使用閉合建立一個數 tree = fileTree('src') { include '**/*.java' } // 使用map建立一個樹 tree = fileTree(dir: 'src', include: '**/*.java') tree = fileTree(dir: 'src', includes: ['**/*.java', '**/*.xml']) tree = fileTree(dir: 'src', include: '**/*.java', exclude: '**/*test*/**') // 遍歷文件樹 tree.each {File file -> println file } // 過濾文件樹 FileTree filtered = tree.matching { include 'org/gradle/api/**' } // 合併文件樹A FileTree sum = tree + fileTree(dir: 'src/test') // 訪問文件數的元素 tree.visit {element -> println "$element.relativePath => $element.file" }
咱們還可使用ZIP或TAR等壓縮文件的內容做爲文件樹,Project.zipTree()和Project.tarTree()方法能夠返回一個FileTree實例。以下:
// 使用路徑建立一個ZIP文件 FileTree zip = zipTree('someFile.zip') // 使用路徑建立一個TAR文件 FileTree tar = tarTree('someFile.tar') //TarTree能夠根據文件擴展名獲得壓縮方式,若是咱們想明確的指定壓縮方式則能夠以下操做 FileTree someTar = tarTree(resources.gzip('someTar.ext'))
指定輸入文件:
Gradle中有些對象的屬性能夠接收一組輸入文件,譬如JavaComplile任務的source屬性(定義編譯的源文件)。以下:
//使用一個File對象設置源目錄 compile { source = file('src/main/java') } //使用一個字符路徑設置源目錄 compile { source = 'src/main/java' } //使用一個集合設置多個源目錄 compile { source = ['src/main/java', '../shared/java'] } //使用FileCollection或者FileTree設置源目錄 compile { source = fileTree(dir: 'src/main/java').matching {include 'org/gradle/api/**'} } //使用閉包設置源目錄 compile { source = { // Use the contents of each zip file in the src dir file('src').listFiles().findAll {it.name.endsWith('.zip')}.collect { zipTree(it) } } } compile { //使用字符路徑添加源目錄 source 'src/main/java', 'src/main/groovy' //使用File對象添加源目錄 source file('../shared/java') //使用閉包添加源目錄 source { file('src/test/').listFiles() } }
複製文件:
咱們可使用複製任務(Copy)進行文件複製操做,複製任務擴展性很強,它能夠過濾複製文件的內容,使用複製任務要提供想要複製的源文件和一個目標目錄,若是要指定文件被複制時的轉換方式則可使用複製規則,複製規則是一個CopySpec接口的實現,咱們使用CopySpec.from()方法指定源文件,CopySpec.into()方法指定目標目錄便可。以下:
task copyTask(type: Copy) {
from 'src/main/webapp' into 'build/explodedWar' } task anotherCopyTask(type: Copy) { //複製src/main/webapp目錄下的全部文件 from 'src/main/webapp' //複製一個單獨文件 from 'src/staging/index.html' //複製一個任務輸出的文件 from copyTask //顯式使用任務的outputs屬性複製任務的輸出文件 from copyTaskWithPatterns.outputs //複製一個ZIP壓縮文件的內容 from zipTree('src/main/assets.zip') //指定目標目錄 into { getDestDir() } } task copyTaskWithPatterns(type: Copy) { from 'src/main/webapp' into 'build/explodedWar' include '**/*.html' include '**/*.jsp' exclude { details -> details.file.name.endsWith('.html') && details.file.text.contains('staging') } } task copyMethod << { copy { from 'src/main/webapp' into 'build/explodedWar' include '**/*.html' include '**/*.jsp' } } //在複製時重命名文件 task rename(type: Copy) { from 'src/main/webapp' into 'build/explodedWar' //使用閉包映射文件名 rename { String fileName -> fileName.replace('-staging-', '') } // 使用正則表達式映射文件名 rename '(.+)-staging-(.+)', '$1$2' rename(/(.+)-staging-(.+)/, '$1$2') }
文件同步任務:
同步任務(Sync)繼承自複製任務(Copy),當執行時會複製源文件到目標目錄,而後從目標目錄刪除全部非複製文件。以下:
task libs(type: Sync) { from configurations.runtime into "$buildDir/libs" }
建立歸檔文件:
使用歸檔任務能夠建立Zip、Tar、Jar、War、Ear等歸檔文件,以下:
apply plugin: 'java' task zip(type: Zip) { from 'src/dist' into('libs') { from configurations.runtime } }ps:http://blog.csdn.net/yanbober/article/details/49314255