Gradle 提供多種機制來設定 Gradle 本身和特定專案的行為。
以下是使用這些機制的參考
機制 | 資訊 | 範例 |
---|---|---|
設定建置行為和 Gradle 功能的旗標 |
|
|
專屬於 Gradle 專案的屬性 |
|
|
傳遞給 Gradle 執行時期 (JVM) 的屬性 |
|
|
設定 Gradle 設定的屬性 |
|
|
根據環境設定建置行為的屬性 |
|
設定優先順序
設定 Gradle 行為時,可以使用這些方法,但必須考慮其優先順序。下表列出這些方法,從最高優先順序到最低優先順序 (第一個優先)
優先順序 | 方法 | 位置 | 範例 | 詳細資料 |
---|---|---|---|---|
1 |
命令列 |
|
這些優先於屬性和環境變數。 |
|
2 |
專案根目錄 |
|
儲存在 |
|
3 |
|
|
儲存在 |
|
4 |
環境 |
|
由執行 Gradle 的環境提供。 |
專案屬性
專案屬性專屬於您的 Gradle 專案。它們使用組塊在您的建置指令碼或直接在 project
物件中定義。
例如,專案屬性 myProperty
在建置檔案中建立
ext {
myProperty = findProperty('myProperty') ?: 'Hello, world!'
}
println "My property value: ${project.ext.myProperty}"
您有兩個選項可以新增專案屬性,其優先順序如下
-
命令列:您可以透過
-P
命令列選項直接將屬性新增到您的 Project 物件。$ ./gradlew build -PmyProperty='Hi, world'
-
系統屬性或環境變數:您可以使用特別命名的系統屬性或環境變數設定專案屬性。
$ ./gradlew build -Dorg.gradle.project.myProperty='Hi, world'
如果環境變數名稱看起來像 ORG_GRADLE_PROJECT_prop=somevalue
,則 Gradle 會在您的專案物件上設定一個 prop
屬性,其值為 somevalue
。Gradle 也支援系統屬性,但命名模式不同,看起來像 org.gradle.project.prop
。
下列範例會將您的專案物件上的 foo
屬性設定為 "bar"
。
範例 1:透過命令列設定專案屬性。
$ ./gradlew build -Pfoo=bar
範例 2:透過系統屬性設定專案屬性。
org.gradle.project.foo=bar
範例 3:透過環境變數設定專案屬性。
$ export ORG_GRADLE_PROJECT_foo=bar
這個功能在您沒有連續整合伺服器的管理員權限,而且需要設定不容易看到的屬性值時非常有用。由於您無法在該情境中使用 -P
選項,也無法變更系統層級的設定檔,因此正確的策略是變更連續整合建置作業的設定,新增符合預期模式的環境變數設定。這對於系統上的一般使用者來說不會是可見的。
您可以在建置指令碼中使用專案屬性的名稱來存取該屬性,就像變數一樣。
系統屬性
系統屬性是在 JVM 層級設定的變數,且可供 Gradle 建置程序存取。系統屬性可以使用建置指令碼中的 System
類別存取。常見的系統屬性如下列出。
您有兩個選項可以新增系統屬性,依優先順序排列
-
命令列:使用
-D
命令列選項,您可以將系統屬性傳遞給執行 Gradle 的 JVM。gradle
命令的-D
選項與java
命令的-D
選項效果相同。$ ./gradlew build -Dgradle.wrapperUser=myuser
-
gradle.properties
檔案:您也可以在gradle.properties
檔案中設定系統屬性,其字首為systemProp
gradle.propertiessystemProp.gradle.wrapperUser=myuser systemProp.gradle.wrapperPassword=mypassword
以下是常見的系統屬性
gradle.wrapperUser=(myuser)
-
指定使用者名稱以從伺服器下載 Gradle 發行版 使用 HTTP 基本驗證。
gradle.wrapperPassword=(mypassword)
-
指定密碼以使用 Gradle wrapper 下載 Gradle 發行版。
gradle.user.home=(路徑至目錄)
-
指定
GRADLE_USER_HOME
目錄。 https.protocols
-
以逗號分隔的格式指定支援的 TLS 版本。例如,
TLSv1.2,TLSv1.3
。
其他 Java 系統屬性列於 此處。
在多專案建置中,在根目錄專案以外的任何專案中設定的 systemProp
屬性將會略過。只有根目錄專案的 gradle.properties
檔案會檢查以 systemProp
開頭的屬性。
下列範例示範如何使用系統屬性
範例 1:使用 gradle.properties
檔案設定系統屬性
systemProp.system=gradlePropertiesValue
範例 2:在組態時間讀取系統屬性
// Using the Java API
println(System.getProperty("system"))
// Using the Java API
println(System.getProperty("system"))
// Using the Gradle API, provides a lazy Provider<String>
println(providers.systemProperty("system").get())
// Using the Java API
println(System.getProperty("system"))
// Using the Gradle API, provides a lazy Provider<String>
println(providers.systemProperty("system").get())
// Using the Java API
println System.getProperty('system')
// Using the Java API
println System.getProperty('system')
// Using the Gradle API, provides a lazy Provider<String>
println providers.systemProperty('system').get()
// Using the Java API
println System.getProperty('system')
// Using the Gradle API, provides a lazy Provider<String>
println providers.systemProperty('system').get()
範例 3:讀取系統屬性以在執行時間使用
tasks.register<PrintValue>("printProperty") {
// Using the Gradle API, provides a lazy Provider<String> wired to a task input
inputValue = providers.systemProperty("system")
}
tasks.register('printProperty', PrintValue) {
// Using the Gradle API, provides a lazy Provider<String> wired to a task input
inputValue = providers.systemProperty('system')
}
範例 4:從命令列設定系統屬性 -D gradle.wrapperUser=username
$ gradle -Dsystem=commandLineValue
Gradle 屬性
Gradle 提供了多種選項,讓您可以輕鬆設定用於執行建置的 Java 程序。雖然您可以透過 `GRADLE_OPTS` 或 `JAVA_OPTS` 在您的本機環境中設定這些選項,但將某些設定(例如 JVM 記憶體設定和 `JAVA_HOME` 位置)儲存在版本控制中非常有用,這樣整個團隊就可以在一致的環境中工作。
您有一個選項可以新增 Gradle 屬性
-
`gradle.properties` 檔案:將這些設定放入 `gradle.properties` 檔案中,並提交到您的版本控制系統。
gradle.propertiesorg.gradle.caching.debug=false
Gradle 考慮的最終設定是命令列和 `gradle.properties` 檔案中設定的所有 Gradle 屬性的組合。如果在多個位置設定選項,則在這些位置中找到的第一個選項會獲勝
優先順序 | 方法 | 位置 | 詳細資料 |
---|---|---|---|
1 |
命令列介面 |
. |
在命令列中使用 `-D`。 |
2 |
`gradle.properties` 檔案 |
|
儲存在 `GRADLE_USER_HOME` 中的 `gradle.properties` 檔案中。 |
3 |
`gradle.properties` 檔案 |
專案根目錄 |
儲存在專案目錄中的 `gradle.properties` 檔案中,然後是其父專案目錄,直到專案的根目錄。 |
4 |
`gradle.properties` 檔案 |
|
儲存在 `GRADLE_HOME` 中的 `gradle.properties` 檔案中,這是 Gradle 安裝目錄(選用)。 |
`GRADLE_USER_HOME` 的位置可能已透過命令列中傳遞的 `-Dgradle.user.home` 系統屬性事先變更。 |
下列屬性是常見的 Gradle 屬性
org.gradle.caching=(true,false)
-
設定為 `true` 時,Gradle 會在可能的情況下重複使用任何先前建置的任務輸出,進而大幅加快建置速度。
預設為 `false`;建置快取未啟用。
org.gradle.caching.debug=(true,false)
-
設定為 `true` 時,每個任務的個別輸入屬性雜湊和建置快取金鑰會記錄在主控台上。
預設為 `false`。
org.gradle.configuration-cache=(true,false)
-
啟用設定快取。Gradle 會嘗試重複使用先前建置的建置設定。
預設為 `false`。
org.gradle.configureondemand=(true,false)
-
啟用正在孵化的按需設定,Gradle 會嘗試只設定必要的專案。
預設為 `false`。
org.gradle.console=(auto,plain,rich,verbose)
-
自訂主控台輸出色彩或詳細程度。
預設值取決於 Gradle 的呼叫方式。
org.gradle.continue=(true,false)
-
如果啟用,則在任務失敗後繼續執行任務,否則在任務失敗後停止執行任務。
預設為 `false`。
org.gradle.daemon=(true,false)
-
設定為
true
時,Gradle Daemon 會用於執行建置。預設值為
true
。 org.gradle.daemon.idletimeout=(閒置毫秒數)
-
Gradle Daemon 會在指定的閒置毫秒數後自行終止。
預設值為
10800000
(3 小時)。 org.gradle.debug=(true,false)
-
設定為
true
時,Gradle 會在啟用遠端偵錯的情況下執行建置,並在埠 5005 上監聽。請注意,這等同於將-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005
新增到 JVM 命令列,並且會暫停虛擬機器,直到附加偵錯器為止。預設為 `false`。
org.gradle.java.home=(JDK 安裝目錄的路徑)
-
指定 Gradle 建置程式的 Java 安裝目錄。此值可以設定為
jdk
或jre
位置;不過,視建置內容而定,使用 JDK 會比較安全。這不會影響用於啟動 Gradle 執行時期環境 的 Java 版本。如果未指定設定,預設值會從您的環境(
JAVA_HOME
或java
的路徑)取得。 org.gradle.jvmargs=(JVM 引數)
-
指定用於 Gradle Daemon 的 JVM 引數。此設定對於 設定 JVM 記憶體設定 以提升建置效能特別有用。這不會影響 Gradle 執行時期環境的 JVM 設定。
預設值為
-Xmx512m "-XX:MaxMetaspaceSize=384m"
。 org.gradle.logging.level=(quiet,warn,lifecycle,info,debug)
-
設定為 quiet、warn、info 或 debug 時,Gradle 會使用此 記錄等級。這些值不區分大小寫。
預設值為
lifecycle
等級。 org.gradle.parallel=(true,false)
-
設定後,Gradle 會分派最多
org.gradle.workers.max
個 JVM 來 並行執行專案。預設為 `false`。
org.gradle.priority=(low,normal)
-
指定 Gradle Daemon 及其啟動的所有程式的 排程優先順序。
預設值為
normal
。 org.gradle.projectcachedir=(目錄)
-
指定專案特定的快取目錄。預設為根專案目錄中的
.gradle
。預設值為
.gradle
。 org.gradle.unsafe.isolated-projects=(true,false)
-
啟用專案隔離,這會啟用設定快取。
預設為 `false`。
org.gradle.vfs.verbose=(true,false)
-
在 監控檔案系統 時設定詳細記錄。
預設為 `false`。
org.gradle.vfs.watch=(true,false)
-
切換監控檔案系統。啟用時,Gradle 會在建置之間重複使用它從檔案系統收集的資訊。
預設為
true
,適用於 Gradle 支援此功能的操作系統。 org.gradle.warning.mode=(all,fail,summary,none)
-
設定為
all
、summary
或none
時,Gradle 會使用不同的警告類型顯示。預設為
summary
。 org.gradle.workers.max=(工作程序的最大數量)
-
設定後,Gradle 會使用給定的工作程序數量作為上限。
預設為 CPU 處理器的數量。
下列範例示範如何使用 Gradle 屬性。
範例 1:使用 gradle.properties
檔案設定 Gradle 屬性
gradlePropertiesProp=gradlePropertiesValue
gradleProperties.with.dots=gradlePropertiesDottedValue
範例 2:在設定時間讀取 Gradle 屬性
// Using the API, provides a lazy Provider<String>
println(providers.gradleProperty("gradlePropertiesProp").get())
// Using Kotlin delegated properties on `settings`
val gradlePropertiesProp: String by settings
println(gradlePropertiesProp)
// Using the API, provides a lazy Provider<String>
println(providers.gradleProperty("gradlePropertiesProp").get())
// Using Kotlin delegated properties on `project`
val gradlePropertiesProp: String by project
println(gradlePropertiesProp)
// Using the API, provides a lazy Provider<String>
println providers.gradleProperty('gradlePropertiesProp').get()
// Using Groovy dynamic names
println gradlePropertiesProp
println settings.gradlePropertiesProp
// Using Groovy dynamic array notation on `settings`
println settings['gradlePropertiesProp']
// Using the API, provides a lazy Provider<String>
println providers.gradleProperty('gradlePropertiesProp').get()
// Using Groovy dynamic names
println gradlePropertiesProp
println project.gradlePropertiesProp
// Using Groovy dynamic array notation on `project`
println project['gradlePropertiesProp']
Kotlin 委派屬性是 Gradle Kotlin DSL 的一部分。您需要明確指定類型為 String
。如果您需要根據屬性的存在與否進行分支,您也可以使用 String?
並檢查 null
。
請注意,如果 Gradle 屬性的名稱包含句點,則無法使用動態 Groovy 名稱。您必須改用 API 或動態陣列表示法。
範例 3:讀取 Gradle 屬性以供執行時間使用
tasks.register<PrintValue>("printProperty") {
// Using the API, provides a lazy Provider<String> wired to a task input
inputValue = providers.gradleProperty("gradlePropertiesProp")
}
tasks.register('printProperty', PrintValue) {
// Using the API, provides a lazy Provider<String> wired to a task input
inputValue = providers.gradleProperty('gradlePropertiesProp')
}
範例 4:從命令列設定 Gradle 屬性
$ gradle -DgradlePropertiesProp=commandLineValue
請注意,初始化指令碼無法直接讀取 Gradle 屬性。在初始化指令碼中最早可以讀取 Gradle 屬性的時間是在 settingsEvaluated {}
範例 5:從初始化指令碼讀取 Gradle 屬性
settingsEvaluated {
// Using the API, provides a lazy Provider<String>
println(providers.gradleProperty("gradlePropertiesProp").get())
// Using Kotlin delegated properties on `settings`
val gradlePropertiesProp: String by this
println(gradlePropertiesProp)
}
settingsEvaluated { settings ->
// Using the API, provides a lazy Provider<String>
println settings.providers.gradleProperty('gradlePropertiesProp').get()
// Using Groovy dynamic names
println settings.gradlePropertiesProp
// Using Groovy dynamic array notation on `settings`
println settings['gradlePropertiesProp']
}
在子專案目錄中宣告的 gradle.properties
檔案中的屬性僅對該專案及其子專案可用。
環境變數
Gradle 提供多個環境變數,如下所列。您可以在建置指令碼中使用 System.getenv()
方法,將環境變數存取為屬性。
下列環境變數可供 gradle
命令使用。
GRADLE_HOME
-
Gradle 的安裝目錄。
可用於指定本機 Gradle 版本,而不是使用 wrapper。
您可以將
GRADLE_HOME/bin
新增到您的PATH
中,以供特定應用程式和使用案例使用(例如測試 Gradle 的早期版本)。 JAVA_OPTS
-
用於傳遞 JVM 選項和自訂設定給 JVM。
GRADLE_OPTS
-
指定啟動 Gradle 客户端 VM 時要使用的 JVM 參數。
客户端 VM 僅處理命令列輸入/輸出,因此很少需要變更其 VM 選項。
實際建置由 Gradle 守護程式執行,不受此環境變數影響。
GRADLE_USER_HOME
-
指定 Gradle 儲存其全域組態屬性、初始化指令碼、快取、記錄檔等內容的
GRADLE_USER_HOME
目錄。若未設定,則預設為
USER_HOME/.gradle
。 JAVA_HOME
-
指定要供客户端 VM 使用的 JDK 安裝目錄。
此 VM 也用於守護程式,除非在 Gradle 屬性檔中使用
org.gradle.java.home
指定不同的 VM。 GRADLE_LIBS_REPO_OVERRIDE
-
覆寫預設 Gradle 函式庫儲存庫。
可用於在
org.gradle.plugins.ide.internal.resolver
中指定預設 Gradle 儲存庫 URL。若您的公司使用防火牆/代理伺服器,則可使用此覆寫來指定內部主機的儲存庫。
以下範例說明如何使用環境變數。
範例 1:在組態時讀取環境變數
// Using the Java API
println(System.getenv("ENVIRONMENTAL"))
// Using the Java API
println(System.getenv("ENVIRONMENTAL"))
// Using the Gradle API, provides a lazy Provider<String>
println(providers.environmentVariable("ENVIRONMENTAL").get())
// Using the Java API
println(System.getenv("ENVIRONMENTAL"))
// Using the Gradle API, provides a lazy Provider<String>
println(providers.environmentVariable("ENVIRONMENTAL").get())
// Using the Java API
println System.getenv('ENVIRONMENTAL')
// Using the Java API
println System.getenv('ENVIRONMENTAL')
// Using the Gradle API, provides a lazy Provider<String>
println providers.environmentVariable('ENVIRONMENTAL').get()
// Using the Java API
println System.getenv('ENVIRONMENTAL')
// Using the Gradle API, provides a lazy Provider<String>
println providers.environmentVariable('ENVIRONMENTAL').get()
範例 2:在執行時讀取環境變數以供使用
tasks.register<PrintValue>("printValue") {
// Using the Gradle API, provides a lazy Provider<String> wired to a task input
inputValue = providers.environmentVariable("ENVIRONMENTAL")
}
tasks.register('printValue', PrintValue) {
// Using the Gradle API, provides a lazy Provider<String> wired to a task input
inputValue = providers.environmentVariable('ENVIRONMENTAL')
}