GradleWrapper、命令行和環(huán)境配置

前言

這三個(gè)知識(shí)點(diǎn)不難,但經(jīng)常用到,如果不看官方文檔,有時(shí)候并不知道怎么使用,出現(xiàn)問題也不知道原因,所以有必要做一個(gè)總結(jié)。由于每個(gè)知識(shí)點(diǎn)都不多,又有關(guān)聯(lián),所以放在同一節(jié)。

Gradle Wrapper

Gradle Wrapper(以下簡(jiǎn)寫為“Wrapper”)用于管理當(dāng)前項(xiàng)目的Gradle版本,Gradle官方強(qiáng)烈推薦使用Wrapper構(gòu)建項(xiàng)目。多人協(xié)作時(shí),必須規(guī)定項(xiàng)目的Gradle版本,并以此版本的Gradle作為項(xiàng)目的構(gòu)建工具,由于每個(gè)人在本地安裝的Gradle版本可能并不一致(也沒有必要一致),因此有必要在項(xiàng)目中統(tǒng)一管理Gradle版本。

Wrapper的文件結(jié)構(gòu)如下(項(xiàng)目根目錄中):

├── build.gradle
├── settings.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
└── gradlew.bat

包括一個(gè)gradle文件和兩個(gè)可執(zhí)行的腳本文件gradlew(macOS等平臺(tái)用)和gradlew.bat(Windows平臺(tái)用)。

  • gradle-wrapper.jar。用于下載所需版本的Gradle。
  • gradle-wrapper.properties。配置Gradle的版本號(hào)、本地存儲(chǔ)地址等。各屬性說明請(qǐng)見官方文檔
  • gradlew, gradlew.bat。Wrapper的執(zhí)行腳本,用于替代gradle命令來構(gòu)建項(xiàng)目。

注意:gradle-wrapper.properties中有一個(gè)distributionUrl屬性,用于定義Gradle版本地下載URL,如distributionUrl=https\://services.gradle.org/distributions/gradle-4.0-all.zip,版本號(hào)后面有個(gè)“-all”,有時(shí)你也可能看到“-bin”,是什么意思呢?"-all"表示會(huì)下載此版本Gralde的所有的資源,包括二進(jìn)制運(yùn)行時(shí)文件、示例代碼和相關(guān)文檔。“-bin”表示只下載二進(jìn)制運(yùn)行時(shí)文件。

Wrapper 構(gòu)建項(xiàng)目時(shí),其工作流程如下:

  1. 檢查規(guī)定的Gradle版本,如果沒有則去服務(wù)器下載。
  2. 下載的Gradle版本存儲(chǔ)在Gradle的用戶目錄中。如macOS中默認(rèn)存儲(chǔ)所有的Gradle版本到/Users/yourname/.gradle/wrapper/dists/中。
  3. 使用解壓后的Gradle版本來構(gòu)建項(xiàng)目。
wrapper workflow

添加Wrapper

使用命令行添加Wrapper有兩種方式:

  1. 使用gradle init創(chuàng)建新項(xiàng)目,則會(huì)初始化一個(gè)帶有Wrapper的Gradle項(xiàng)目。
  2. 使用gradle wrapper在舊的項(xiàng)目中添加Wrapper。

wrapper是Gradle的內(nèi)建任務(wù)

一般的IDE創(chuàng)建項(xiàng)目時(shí)都會(huì)自動(dòng)生產(chǎn)Wrapper文件,如Android Studio。

使用Wrapper執(zhí)行任務(wù)

用Wrapper腳本替換掉gradle來執(zhí)行任務(wù)即可。以macOS平臺(tái)為例,在項(xiàng)目根目錄下執(zhí)行./gradlew [task name]即可,如列出當(dāng)前項(xiàng)目的所有任務(wù),項(xiàng)目根目錄下執(zhí)行:

$ ./gradlew tasks

更新Wrapper

有兩種方式更新Wrapper

  1. 命令行方法。.gradlew wrapper --gradle-version [要更新的版本號(hào)]
  2. 修改gradle/wrapper/gradle-wrapper.properties中的distributionUrl屬性。


Gradle命令行

與Gradle交互有兩種方式,一是命令行界面,二是IDE的圖形界面,如Android Studio。IDE方式各有不同且未必包括所有的命令行指令,但命令行方式卻是不變的,因此需要學(xué)會(huì)基本的命令行指令,以不變應(yīng)萬變。

注意:在項(xiàng)目中使用命令行方式時(shí),推薦使用./gradlew or gradlew.bat 來代替 gradle。示例中為了方便,統(tǒng)一使用gradle

命令行指令可以自定義,參見declaring_and_using_command_line_options

指令形式

gradle [taskName...] [--option-name...]

說明

  • 任務(wù)名(taskName)有多個(gè)時(shí),使用空格分開,如gradle task1 task2

  • 在多項(xiàng)目工程中,執(zhí)行某個(gè)項(xiàng)目的任務(wù)時(shí),可以用“:”將項(xiàng)目名添加到任務(wù)名之前,如

    $ gradle projectName:taskName
    $ gradle :projectName:taskName
    
  • 可選項(xiàng)(option-name)如果接收參數(shù),建議使用=拼接,如

    $ gradle task1 --console=plain
    
  • 可選項(xiàng)規(guī)定一個(gè)行為時(shí),可使用--no-作為其全稱(long-form)前綴,來指定它的對(duì)立行為。如

    --build-cache
    --no-build-cache
    
  • 可選項(xiàng)的全稱名稱常有簡(jiǎn)寫形式 ,如

    --help
    -h
    

常見內(nèi)建(built-in)任務(wù)指令

  • gradle build。生成所有的輸出,并執(zhí)行所有的檢查。
  • gradle run。生成應(yīng)用程序并執(zhí)行某些腳本或二進(jìn)制文件
  • gradle check。執(zhí)行所有檢測(cè)類任務(wù)如tests、linting等
  • gradle clean。刪除build文件目錄。
  • gradle projects。查看項(xiàng)目結(jié)構(gòu)。
  • gradle tasks。查看任務(wù)列表。查看某個(gè)任務(wù)詳細(xì)信息,可用gradle help --task someTask
  • gradle dependencies。查看依賴列表。

部分常見命令行選項(xiàng)說明如下:

調(diào)試類

  • -?, -h, --help。查看幫助信息。
  • -v,--version。查看版本信息。
  • -s,--stacktrace。執(zhí)行任務(wù)時(shí),打印棧信息。如gradle build --s

其他選項(xiàng)說明見官方文檔Debugging options

日志類

  • -q, --quiet。只打印errors類信息。
  • -i, --info。打印詳細(xì)的信息。

其他選項(xiàng)說明見官方文檔Logging options,更多關(guān)于日志類描述請(qǐng)見Logging

性能類

用于優(yōu)化構(gòu)建的性能

  • --configure-on-demand,--no-configure-on-demand。是否開啟按需配置模式。
  • --build-cache, --no-build-cache。是否使用緩存。

其他選項(xiàng)說明見官方文檔Performance Options,更多關(guān)于性能優(yōu)化方面的描述請(qǐng)見 improving performance of Gradle builds here.

環(huán)境配置類

用于配置構(gòu)建時(shí)的環(huán)境

  • -c, --settings-file。如果不用默認(rèn)的settings.gradle時(shí),可指定Setting文件。
  • -b, --build-file。指定構(gòu)建文件。
  • -Dorg.gradle.jvmargs。設(shè)置JVM參數(shù)。

其他選項(xiàng)說明見官方文檔Environment options,更多關(guān)于環(huán)境配置方面的描述請(qǐng)見build environment


環(huán)境配置

配置構(gòu)建環(huán)境,主要配置Gradle構(gòu)建參數(shù)和對(duì)應(yīng)的JVM參數(shù),如代理策略等。其目的是為了多人協(xié)作時(shí),保持在一致的環(huán)境下進(jìn)行項(xiàng)目開發(fā)。

配置環(huán)境有幾種途徑,優(yōu)先級(jí)從高往低,列出如下:

  1. 命令行。
  2. GRADLE_USER_HOME目錄中的gradle.properties文件。
  3. 項(xiàng)目根目錄中的gradle.properties文件。
  4. 環(huán)境變量。運(yùn)行Gradle環(huán)境的變量,如JAVA_HOME等。

配置環(huán)境其實(shí)是設(shè)置各種屬性參數(shù),以上四種方式對(duì)于某些屬性都可以配置。其中命令行和gradle.properties文件方式支持所有屬性的配置。屬性有不同的級(jí)別,按照優(yōu)先級(jí)從高到底列出如下:

  1. 系統(tǒng)屬性(System properties)。
  2. Gradle屬性。

系統(tǒng)屬性

用于設(shè)置Gradle的JVM環(huán)境。

  1. 命令行方式。通過給屬性添加-D前綴來設(shè)置。如gradle -Dgradle.user.home=foo
  2. gradle.properties文件方式。根目錄中,為屬性添加systemProp.前綴,如systemProp.gradle.wrapperUser=myuser

幾個(gè)系統(tǒng)屬性如下:

  • gradle.wrapperUser=(myuser)。設(shè)置Wrapper下載Gradle版本的代理服務(wù)器的用戶名。
  • gradle.wrapperPassword=(mypassword)。設(shè)置Wrapper下載Gradle版本的代理服務(wù)器的密碼。
  • gradle.user.home=(path to directory)。設(shè)置Gradle用戶目錄地址。

Gradle屬性

Gradle屬性都有對(duì)應(yīng)的命令行方式,gradle.properties文件屬性和對(duì)應(yīng)的命令行如下:

gradle.properties文件屬性 命令行指令
org.gradle.caching=(true,false) --build-cache, --no-build-cache
org.gradle.caching.debug=(true,false) ?
org.gradle.configureondemand=(true,false) --configure-on-demand, --no-configure-on-demand
org.gradle.console=(auto,plain,rich,verbose) --console=(auto,plain,rich,verbose)
org.gradle.daemon=(true,false) --daemon, --no-daemon
org.gradle.daemon.idletimeout=(# of idle millis) -Dorg.gradle.daemon.idletimeout=(number of milliseconds)
org.gradle.debug=(true,false) -Dorg.gradle.debug=(true,false)
org.gradle.java.home=(path to JDK home) -Dorg.gradle.java.home
org.gradle.jvmargs=(JVM arguments) -Dorg.gradle.jvmargs
org.gradle.logging.level=(quiet,warn,lifecycle,info,debug) -Dorg.gradle.logging.level=(quiet,warn,lifecycle,info,debug)或者 -q-w-i-d
org.gradle.parallel=(true,false) --parallel, --no-parallel
org.gradle.warning.mode=(all,none,summary) -Dorg.gradle.warning.mode=(all,none,summary) 或者--warning-mode=(all,none,summary)
org.gradle.workers.max=(max # of worker processes) --max-workers

詳細(xì)說明請(qǐng)見Gradle properties

另外官網(wǎng)中有項(xiàng)目屬性和通過項(xiàng)目屬性配置任務(wù)的說明,這里不做描述,請(qǐng)見官網(wǎng)Project properties

示例-設(shè)置JVM參數(shù)

對(duì)于每個(gè)Java虛擬機(jī)進(jìn)程,Gradle默認(rèn)配置堆空間最大為1024MB(-Xmx1024m)。-Xmx1024m根據(jù)項(xiàng)目大小,可以修改這一參數(shù)。如果使用了Gradle Daemon(org.gradle.daemon=true,默認(rèn)開啟),則配置參數(shù)如下:

org.gradle.jvmargs=-Xmx2g -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

Java虛擬機(jī)參數(shù)設(shè)置參考Java HotSpot VM Options:Java 8及以上Java 7參考。上面的參數(shù)說明如下:

  • -Xmx[size]。設(shè)置虛擬機(jī)最大內(nèi)存空間。必須是1024的倍數(shù),且不能小于2MB,單位為k/K、m/M、g/G,默認(rèn)值隨系統(tǒng)配置而變。與XX:MaxHeapSize等價(jià)。示例80MB:

    -Xmx83886080
    -Xmx81920k
    -Xmx80m
    
  • -XX:MaxPermSize=[size]。設(shè)置持久代最大空間,持久代用于存儲(chǔ)常量等,如果報(bào)java.lang.OutOfMemoryError: PermGen space的異常,則需要增加這一空間。

    Java虛擬機(jī)內(nèi)存劃分請(qǐng)見Oracle官方文檔Generations

  • -XX:-HeapDumpOnOutOfMemoryError。當(dāng)拋出java.lang.OutOfMemoryError異常時(shí),將堆內(nèi)容存儲(chǔ)到文件中,用于調(diào)試。

  • -Dfile.encoding=UTF-8。虛擬機(jī)編碼格式。

    在參考文檔中并沒有找到``-Dfile.encoding`設(shè)置

示例-設(shè)置代理

國(guó)內(nèi)下載依賴和Google資源時(shí)有時(shí)候速度很慢,可以通過設(shè)置HTTP和HTTPS代理服務(wù)解決。在gradle.properties中設(shè)置如下:

# http代理
systemProp.http.proxyHost=www.somehost.org
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=userid
systemProp.http.proxyPassword=password
systemProp.http.nonProxyHosts=*.nonproxyrepos.com|localhost

# https代理
systemProp.https.proxyHost=www.somehost.org
systemProp.https.proxyPort=8080
systemProp.https.proxyUser=userid
systemProp.https.proxyPassword=password
systemProp.https.nonProxyHosts=*.nonproxyrepos.com|localhost

如果沒有user和password,可以不用寫。

其他的代理參數(shù)可以參考Java文檔Networking Properties


參考

  1. Gradle官網(wǎng)-Gradle Wrapper
  2. Gradle官網(wǎng)-Command-Line Interface
  3. Gradle官網(wǎng)-Build Environment
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,868評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,937評(píng)論 6 342
  • 本篇文章已授權(quán)微信公眾號(hào) dasu_Android(大蘇)獨(dú)家發(fā)布 最近看了一本書《Android Gradle ...
    請(qǐng)叫我大蘇閱讀 8,632評(píng)論 8 108
  • 轉(zhuǎn)載(未找到原始鏈接) Gradle是一種構(gòu)建工具,它拋棄了基于XML的構(gòu)建腳本,取而代之的是采用一種基于Gro...
    GYLEE閱讀 4,107評(píng)論 0 2
  • 說明 本文主要介紹和Gradle關(guān)系密切、相對(duì)不容易理解的配置,偏重概念介紹。部分內(nèi)容是Android特有的(例如...
    jzj1993閱讀 15,712評(píng)論 1 62