Gradle 教程 - 雜七雜八

2022-08-03 14:38 更新

創(chuàng)建目錄

有一個常見的情況是,多個任務(wù)都依賴于某個目錄的存在。當(dāng)然,你可以在這些任務(wù)的開始加入 mkdir 來解決這個問題。但這是種臃腫的解決方法。這里有一個更好的解決方案 (僅適用于這些需要這個目錄的任務(wù)有著 dependsOn 的關(guān)系的情況):

使用 mkdir 創(chuàng)建目錄

build.gradle

classesDir = new File('build/classes')
task resources << {
    classesDir.mkdirs()
    // do something
}
task compile(dependsOn: 'resources') << {
    if (classesDir.isDirectory()) {
        println 'The class directory exists. I can operate'
    }
    // do something
}  

gradle -q compile的輸出結(jié)果

> gradle -q compile
The class directory exists. I can operate  

Gradle 屬性和系統(tǒng)屬性

Gradle 提供了許多方式將屬性添加到您的構(gòu)建中。 從Gradle 啟動的 JVM,你可以使用 -D 命令行選項(xiàng)向它傳入一個系統(tǒng)屬性。 Gradle 命令的-D選項(xiàng)和 java 命令的 -D 選項(xiàng)有著同樣的效果。

此外,您也可以通過屬性文件向您的 project 對象添加屬性。您可以把一個 gradle.properties 文件放在 Gradle 的用戶主目錄(默認(rèn)為 USER_HOME/.gradle),或您的項(xiàng)目目錄中。對于多項(xiàng)目構(gòu)建,您可以將 gradle.properties 文件放在任何子項(xiàng)目的目錄中。通過 project 對象,可以訪問到 gradle.properties 里的屬性。用戶的主目錄中的屬性文件比項(xiàng)目目錄中的屬性文件更先被訪問到。

你也可以通過使用-P命令行選項(xiàng)來直接向您的項(xiàng)目對象添加屬性。在更多的用法中,您甚至可以通過系統(tǒng)和環(huán)境屬性把屬性直接傳給項(xiàng)目對象。例如,如果你在一個持續(xù)集成服務(wù)器上運(yùn)行構(gòu)建,但你沒有這臺機(jī)器的管理員權(quán)限,而你的構(gòu)建腳本需要一些不能讓其他人知道的屬性值,那么,您就不能使用 -P 選項(xiàng)。在這種情況下,您可以在項(xiàng)目管理部分 (對普通用戶不可見) 添加一個環(huán)境屬性。如果環(huán)境屬性遵循 ORG_GRADLE_PROJECT_propertyName= somevalue 的模式,這里的 propertyName 會被添加到您的項(xiàng)目對象中。對系統(tǒng)屬性我們也支持相同的機(jī)制。唯一的區(qū)別是,它是 org.gradle.projectpropertyName 的模式。

通過 gradle.properties 文件,你還可以設(shè)置系統(tǒng)屬性。如果此類文件中的屬性有一個systemProp.的前綴,該屬性和它的值會被添加到系統(tǒng)屬性,且不帶此前綴。在多項(xiàng)目構(gòu)建中,除了在根項(xiàng)目之外的任何項(xiàng)目里的 systemProp. 屬性集都將被忽略。也就是,只有根項(xiàng)目gradle.properties 文件里的 systemProp. 屬性會被作為系統(tǒng)屬性。

使用 gradle.properties 文件設(shè)置屬性

gradle.properties

gradlePropertiesProp=gradlePropertiesValue
systemProjectProp=shouldBeOverWrittenBySystemProp
envProjectProp=shouldBeOverWrittenByEnvProp
systemProp.system=systemValue  

build.gradle

task printProps << {
    println commandLineProjectProp
    println gradlePropertiesProp
    println systemProjectProp
    println envProjectProp
    println System.properties['system']
}  

gradle -q -PcommandLineProjectProp=commandLineProjectPropValue -Dorg.gradle.project.systemProjectProp=systemPropertyValue printProps的輸出結(jié)果

> gradle -q -PcommandLineProjectProp=commandLineProjectPropValue -Dorg.gradle.project.systemProjectProp=systemPropertyValue printProps
commandLineProjectPropValue
gradlePropertiesValue
systemPropertyValue
envPropertyValue
systemValue  

檢查項(xiàng)目的屬性

當(dāng)你要使用一個變量時,你可以僅通過其名稱在構(gòu)建腳本中訪問一個項(xiàng)目的屬性。如果此屬性不存在,則會引發(fā)異常,并且構(gòu)建失敗。如果您的構(gòu)建腳本依賴于一些可選屬性,而這些屬性用戶可能在比如 gradle.properties 文件中設(shè)置,您就需要在訪問它們之前先檢查它們是否存在。你可以通過使用方法 hasProperty('propertyName') 來進(jìn)行檢查,它返回 true 或 false。

使用外部構(gòu)建腳本配置項(xiàng)目

您可以使用外部構(gòu)建腳本來配置當(dāng)前項(xiàng)目。Gradle 構(gòu)建語言的所有內(nèi)容在外部腳本中也可以使用。您甚至可以在外部腳本中應(yīng)用其他腳本。

使用外部構(gòu)建腳本配置項(xiàng)目

build.gradle

apply from: 'other.gradle'  

other.gradle

println "configuring $project"
task hello << {
    println 'hello from other script'
}  

gradle -q hello的輸出結(jié)果

> gradle -q hello
configuring root project 'configureProjectUsingScript'
hello from other script  

配置任意對象

您可以用以下非常易理解的方式配置任意對象。

配置任意對象

build.gradle

task configure << {
    pos = configure(new java.text.FieldPosition(10)) {
        beginIndex = 1
        endIndex = 5
    }
    println pos.beginIndex
    println pos.endIndex
}  

gradle -q configure 的輸出結(jié)果

> gradle -q configure
1
5  

使用外部腳本配置任意對象

你還可以使用外部腳本配置任意對象

使用腳本配置任意對象

build.gradle

task configure << {
    pos = new java.text.FieldPosition(10)
    // Apply the script
    apply from: 'other.gradle', to: pos
    println pos.beginIndex
    println pos.endIndex
}  

other.gradle

beginIndex = 1;
endIndex = 5;  

gradle -q configure 的輸出結(jié)果

> gradle -q configure
1
5  

緩存

為了提高響應(yīng)速度,默認(rèn)情況下 Gradle 會緩存所有已編譯的腳本。這包括所有構(gòu)建腳本,初始化腳本和其他腳本。你第一次運(yùn)行一個項(xiàng)目構(gòu)建時, Gradle 會創(chuàng)建 .gradle 目錄,用于存放已編譯的腳本。下次你運(yùn)行此構(gòu)建時, 如果該腳本自它編譯后沒有被修改,Gradle 會使用這個已編譯的腳本。否則該腳本會重新編譯,并把最新版本存在緩存中。如果您通過 --recompile-scripts 選項(xiàng)運(yùn)行 Gradle ,會丟棄緩存的腳本,然后重新編譯此腳本并將其存在緩存中。通過這種方式,您可以強(qiáng)制 Gradle 重新生成緩存。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號