Gradle 提供了多種機制來配置 Gradle build 進程和 Gradle 所構建的 Project 的行爲java
咱們可使用下面幾種方式來配置 Gradle,優先級從高到低:web
例如:--build-cache
緩存
例如存儲在 gradle.properties
文件中的systemProp.http.proxyHost=somehost.org
參數服務器
存儲在項目根目錄下的 gradle.properties
文件中的參數或者是 GRADLE_USER_HOME
下的環境變量markdown
例如GRADLE_OPTS
是由執行 Gradle 的環境提供的。app
除了能夠配置 Gradle 構建環境以外,還能夠給 Project 對象添加自定義屬性,(例如 -PreleaseType=final
)來給參與構建的項目添加 releaseType
屬性,它的值爲 final
。jvm
由於 Gradle build 程序是運行在 Java 虛擬機上的,Gradle 提供了多種可選項來配置 Java 虛擬機的執行參數,有時候調整 Java 虛擬機的參數對 Gradle build 的構建速度提高有很是大的幫助ide
另外在版本控制中存儲某些設置(如JVM內存配置和Java home位置)是頗有用的,這樣整個團隊就能夠在一致的環境中工做。gradle
爲Gradle 配置一致的構建環境就像將這些設置放入gradle.properties
文件同樣簡單。該配置是全部gradle.properties
文件的並集,可是若是在多個文件中配置了一個選項,則優先級高的獲勝,如下優先級從高到低:ui
System properties
gradle.properties 在GRADLE_USER_HOME目錄中。
gradle.properties 在項目根目錄中。
gradle.properties 在Gradle安裝目錄中。
下面是一些用於配置 Gradle 構建環境的一些經常使用參數
當設置爲 true 時,Gradle 將使用上一次構建的 Task outputs,這個選項一般會讓構建更快。
當設置爲true時,每一個 Task 的 Input 的 hash 值和與之對應的構建緩存 Key 會打印在在控制檯上
自定義控制檯輸出的顏色或詳細程度。默認值取決於Gradle的調用方式
當設置爲 true 時,將會啓用 Gradle 的守護進程,推薦開啓,這將會大大減小屢次構建的重複初始化 的資源消耗
在指定的空閒毫秒數後,Gradle守護程序將自行終止。默認值爲10800000(3小時)
設置true爲時,Gradle將在啓用遠程調試的狀況下運行構建,偵聽端口5005。
爲 Gradle 的構建進程指定 Java Home,這裏的值能夠是 jdk 也能夠是 jre 的位置,但最好使用 Jdk。若是此項未被設置那麼將會從當前環境中獲取Java_HOME
的值。
配置 JVM 的參數,在這裏配置 JVM 的內存配置對提高 Gradle 構建的表現頗有用。這裏的參數不會影響 Gradle 客戶端的虛擬機(這個概念以後應該會提到) 在這裏能夠配置 JVM 最大堆內存等等,參數之間以空格分離,以-開頭,詳情參考下方 配置 JVM 內存參數
設置 log 的Level,默認值爲 lifecycle,不區分大小寫
當設置爲true以後,JVM 將會使用 org.gradle.workers.max
所設置的工做進程數來並行的執行構建
指定 Gradle 最多使用的工做進程數。默認值爲CPU的處理器數
指定 Gradle 守護進程及其啓動的全部進程的調度優先級,默認爲 normal
配置查看文件系統的詳細日誌記錄,默認關閉
能夠配置不一樣類型的 warining mode
下面是一個例子:
Example 1. Setting properties with a gradle.properties file
#gradle.properties
gradlePropertiesProp=gradlePropertiesValue
sysProp=shouldBeOverWrittenBySysProp
systemProp.system=systemValue
複製代碼
// file:build.gradle.kts
// Project properties can be accessed via delegation
val commandLineProjectProp: String by project
val gradlePropertiesProp: String by project
val systemProjectProp: String by project
tasks.register("printProps") {
doLast {
println(commandLineProjectProp)
println(gradlePropertiesProp)
println(systemProjectProp)
println(System.getProperty("system"))
}
}
複製代碼
輸出爲:
$ gradle -q -PcommandLineProjectProp=commandLineProjectPropValue -Dorg.gradle.project.systemProjectProp=systemPropertyValue printProps
commandLineProjectPropValue
gradlePropertiesValue
systemPropertyValue
systemValue
複製代碼
咱們可使用 -D
的命令行 option 來給運行 Grade 的 JVM 傳遞 System properties 參數
除了使用命令行,咱們也能夠在 gradle.properties 文件中添加 System properties,只須要加上systemProp.
前綴:
systemProp.gradle.wrapperUser=myuser
systemProp.gradle.wrapperPassword=mypassword
複製代碼
下面是一些有效的 System properties:
指定用戶名以使用HTTP基本認證從服務器下載Gradle發行版
指定使用Gradle wrapper 下載Gradle發行版的密碼。
指定Gradle用戶的主目錄。
注: 若是這是一個多項目的構建,也就是說在 settings.gradle 文件中 include 多個子項目。那麼 「systemProp.」 properties 只會讀取根目錄而其餘子項目下的將會被忽略,也就是說若是咱們想要添加 「systemProp.」 properties,必須在根目錄下的 gradle.properties 文件中添加。
下面有三個用於Gradle Command 的環境變量
指定啓動Gradle客戶端虛擬機時使用的JVM參數。客戶端虛擬機只處理命令行的輸入/輸出,因此不多須要更改其VM選項。實際的構建是由Gradle守護進程運行的,它不受這個環境變量的影響。
指定Gradle的用戶主目錄
指定客戶端虛擬機使用的JDK安裝目錄,這個 JDK 安裝目錄也用於 Gradle 守護進程,除非用org.gradle.java.home
在Gradle屬性文件中指定了不一樣的虛擬機。
對於 Project,若是沒有了解過 Gradle 的同窗可能有些陌生,這裏就先簡單介紹下:一個Gradle 構建至少生成一個 Project 對象,一個 Project 對象就對應一個參與構建的項目,那麼相對應的,一個Projct 中就會有不少的 Task。
咱們能夠經過-P命令行選項直接向 Project 對象添加屬性。
咱們能夠經過System properties 或者 Environment variables 添加一些自定義屬性,Gradle 就能夠將這些自定義屬性添加到 Project 屬性中。
例如當咱們設置了一個環境變量:ORG_GRADLE_PROJECT_prop=somevalue
,那麼 Gradle 就會設置一個名爲 prop 的屬性,它的值爲 "somevalue",注意這裏的前綴ORG_GRADLE_PROJECT
。Gradle 也支持經過設置 System properties 來給 Project 對象添加屬性,只是屬性的前綴不一樣,爲:org.gradle.project
。就像 org.gradle.project.prop
,也能夠給 Project 添加一個名爲 prop 的屬性
org.gradle.project.foo=bar
複製代碼
ORG_GRADLE_PROJECT_foo=bar
複製代碼
咱們能夠直接在 build script 中來使用這些自定義屬性
咱們能夠用下面的方式來調整 JVM 參數
Gradle properties:org.gradle.jvmargs
的默認值爲:-Xmx512m "-XX:MaxMetaspaceSize=256m"
org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
複製代碼
Gradle 的客戶端 僅僅用於輸入和控制檯的輸出等,默認值爲:-Xmx64m
JAVA_OPTS="-Xmx64m -XX:MaxPermSize=64m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8"
複製代碼
某些任務,好比 test 任務,也會fork額外的JVM進程。您能夠經過任務自己來配置這些任務。默認狀況下,它們都使用-Xmx512m。
//build.gradle.kts
plugins {
java
}
tasks.withType<JavaCompile>().configureEach {
options.compilerArgs = listOf("-Xdoclint:none", "-Xlint:none", "-nowarn")
}
複製代碼
咱們能夠經過添加 Project 屬性來完成某些特殊功能,好比咱們如今想讓 Release build 只由 CI 觸發,那麼能夠這麼寫:
//build.gradle.kts
tasks.register("performRelease") {
doLast {
if (project.hasProperty("isCI")) {
println("Performing release actions")
} else {
throw InvalidUserDataException("Cannot perform release outside of CI")
}
}
}
複製代碼
$ gradle performRelease -PisCI=true --quiet
Performing release actions
複製代碼