Gradle(二) build 環境配置

Gradle build 環境配置

Gradle 提供了多種機制來配置 Gradle build 進程和 Gradle 所構建的 Project 的行爲java

咱們可使用下面幾種方式來配置 Gradle,優先級從高到低:web

  • 命令行參數

例如:--build-cache緩存

  • System properties

例如存儲在 gradle.properties 文件中的systemProp.http.proxyHost=somehost.org 參數服務器

  • Gradle properties

存儲在項目根目錄下的 gradle.properties 文件中的參數或者是 GRADLE_USER_HOME下的環境變量markdown

  • Environment variables

例如GRADLE_OPTS是由執行 Gradle 的環境提供的。app

除了能夠配置 Gradle 構建環境以外,還能夠給 Project 對象添加自定義屬性,(例如 -PreleaseType=final)來給參與構建的項目添加 releaseType 屬性,它的值爲 finaljvm

Gradle properties

由於 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 構建環境的一些經常使用參數

  • org.gradle.caching=(true,false)

當設置爲 true 時,Gradle 將使用上一次構建的 Task outputs,這個選項一般會讓構建更快。

  • org.gradle.caching.debug=(true,false)

當設置爲true時,每一個 Task 的 Input 的 hash 值和與之對應的構建緩存 Key 會打印在在控制檯上

  • org.gradle.console=(auto,plain,rich,verbose)

自定義控制檯輸出的顏色或詳細程度。默認值取決於Gradle的調用方式

  • org.gradle.daemon=(true,false)

當設置爲 true 時,將會啓用 Gradle 的守護進程,推薦開啓,這將會大大減小屢次構建的重複初始化 的資源消耗

  • org.gradle.daemon.idletimeout=(# of idle millis)

在指定的空閒毫秒數後,Gradle守護程序將自行終止。默認值爲10800000(3小時)

  • org.gradle.debug=(true,false)

設置true爲時,Gradle將在啓用遠程調試的狀況下運行構建,偵聽端口5005。

  • org.gradle.java.home=(path to JDK home)

爲 Gradle 的構建進程指定 Java Home,這裏的值能夠是 jdk 也能夠是 jre 的位置,但最好使用 Jdk。若是此項未被設置那麼將會從當前環境中獲取Java_HOME的值。

  • org.gradle.jvmargs=(JVM arguments) 重要

配置 JVM 的參數,在這裏配置 JVM 的內存配置對提高 Gradle 構建的表現頗有用。這裏的參數不會影響 Gradle 客戶端的虛擬機(這個概念以後應該會提到) 在這裏能夠配置 JVM 最大堆內存等等,參數之間以空格分離,以-開頭,詳情參考下方 配置 JVM 內存參數

  • org.gradle.logging.level=(quiet,warn,lifecycle,info,debug)

設置 log 的Level,默認值爲 lifecycle,不區分大小寫

  • org.gradle.parallel=(true,false)

當設置爲true以後,JVM 將會使用 org.gradle.workers.max 所設置的工做進程數來並行的執行構建

  • org.gradle.workers.max=(max # of worker processes)

指定 Gradle 最多使用的工做進程數。默認值爲CPU的處理器數

  • org.gradle.priority=(low,normal)

指定 Gradle 守護進程及其啓動的全部進程的調度優先級,默認爲 normal

  • org.gradle.vfs.verbose=(true,false)

配置查看文件系統的詳細日誌記錄,默認關閉

  • org.gradle.warning.mode=(all,fail,summary,none)

能夠配置不一樣類型的 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
複製代碼

System properties

咱們可使用 -D 的命令行 option 來給運行 Grade 的 JVM 傳遞 System properties 參數

除了使用命令行,咱們也能夠在 gradle.properties 文件中添加 System properties,只須要加上systemProp.前綴:

systemProp.gradle.wrapperUser=myuser
systemProp.gradle.wrapperPassword=mypassword
複製代碼

下面是一些有效的 System properties

  • gradle.wrapperUser=(myuser)

指定用戶名以使用HTTP基本認證從服務器下載Gradle發行版

  • gradle.wrapperPassword=(mypassword)

指定使用Gradle wrapper 下載Gradle發行版的密碼。

  • gradle.user.home=(path to directory)

指定Gradle用戶的主目錄。

注: 若是這是一個多項目的構建,也就是說在 settings.gradle 文件中 include 多個子項目。那麼 「systemProp.」 properties 只會讀取根目錄而其餘子項目下的將會被忽略,也就是說若是咱們想要添加 「systemProp.」 properties,必須在根目錄下的 gradle.properties 文件中添加。

Environment variables

下面有三個用於Gradle Command 的環境變量

  • GRADLE_OPTS

指定啓動Gradle客戶端虛擬機時使用的JVM參數。客戶端虛擬機只處理命令行的輸入/輸出,因此不多須要更改其VM選項。實際的構建是由Gradle守護進程運行的,它不受這個環境變量的影響。

  • GRADLE_USER_HOME

指定Gradle的用戶主目錄

  • JAVA_HOME

指定客戶端虛擬機使用的JDK安裝目錄,這個 JDK 安裝目錄也用於 Gradle 守護進程,除非用org.gradle.java.home在Gradle屬性文件中指定了不一樣的虛擬機。

Project perperties

對於 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 的屬性

  • system property
org.gradle.project.foo=bar
複製代碼
  • environment variable
ORG_GRADLE_PROJECT_foo=bar
複製代碼

咱們能夠直接在 build script 中來使用這些自定義屬性

配置 JVM 內存參數

咱們能夠用下面的方式來調整 JVM 參數

Gradle properties:org.gradle.jvmargs 的默認值爲:-Xmx512m "-XX:MaxMetaspaceSize=256m"

  • 配置 Gradle 的 build 虛擬機內存參數的例子
org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
複製代碼
  • 配置 Gradle 的 客戶端虛擬機內存參數的例子(一般不須要改變)

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 屬性來配置 Task

咱們能夠經過添加 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
複製代碼
相關文章
相關標籤/搜索