【譯文】gradle命令及技巧(gradle-tips)

原文鏈接:這里
翻譯幫助:谷歌翻譯

Gradle Tips

在過去一年左右,我開始使用Gradle作為我構建基于JVM項目的主要工具。 在使用Gradle之前,我是一個Apache Maven用戶。 Gradle分別從Apache Maven和Apache Ant中汲取了優點。 Gradle從Ant中獲取了靈活的特性,從Maven得到了配置,依賴關系管理和插件的基本規范。 Gradle和Ant一樣,將任務作為一等公民對待。

Gradle構建有三個不同的階段 - 初始化,配置和執行。 初始化階段用來確定所有將參與構建過程的項目,并為每個項目創建一個Project實例。 在配置階段,它會執行所有參與構建過程的項目的構建腳本。 最后,在執行階段,所有在配置階段配置好的任務都會被執行。

在本文中,我將列出我在過去一年左右學到的小技巧。

Contributing to Gradle tips

如果你看到錯誤或者可以做得更好的地方也請貢獻你的一份力量!提個issue或是提交pull request給我都是可以的。歡迎各種貢獻,包括更正,添加,改進和翻譯。

Tip 1: 使用Gradle Wrapper

當我開始使用Gradle,其中一個功能——對包裝腳本的支持使我印象深刻。 Gradle的wrapper將自己包含在項目中,獨立于構建工具的安裝。 它允許您以零配置方式用Gradle構建項目(無需先安裝Gradle distribution)。 這將確保每個人都使用相同版本的構建工具。

要為項目創建Gradle wrapper腳本,可以運行以下命令:

$ gradle wrapper --gradle-version 2.14.1

你需要安裝Gradle到你的電腦上以運行以上的命令(譯者注:可能還要加環境變量)。如果你用的是Mac,你可以用brew安裝gradle。

這將在你的工程里生成少許文件gradlewgradlew.batgradle/wrapper/gradle-wrapper.jargradle/wrapper/gradle-wrapper.properties

確保沒有在版本控制工具中忽略gradle-wrapper.jar文件。默認情況下版本控制會忽略.jar文件

在任何時候,如果你想升級Gradle版本只是重新生成Gradle wrapper腳本傳遞它要使用的Gradle版本。 假設我們要升級到Gradle 3.0-milestone-2,再次運行如下命令:

$ gradle wrapper --gradle-version 3.0-milestone-2

還有,為./gradlew設置一個別名也是個好主意

alias gradle="./gradlew"

Tip 2: 查看依賴圖表

要查看項目的依賴關系圖,您可以運行以下命令:

$ gradle dependencies

Tip 3: 構建單獨的工程

Gradle同時支持單一項目構建和多項目構建。我們假設我們的多項目結構如下所示:

app
  api
    model
    rest
  core
  web
  itests

只構建rest工程我們可以運行以下命令

$ gradle api:rest:build

Tip 4: 排除某些任務

你可以用-x選項去排除一個任務。假設我們希望跳過測試我們可以用以下的命令:

$ gradle clean build -x test

Tip 5: 分析你的構建

Gradle內置了對分析的支持。 如果您遇到性能問題,應該使用--profile選項來生成配置文件報告。 報告 會顯示不同任務花費的時間。 假設我們想要分析構建任務,然后我們可以運行以下命令:

$ gradle --profile build

這將在目錄build/reports/profile下生成報告。

gradle-profile
gradle-profile

Tip 6: Perform dry run

有時你想要查看所有在編譯中將被執行的所有任務擔憂不想執行它們。這個場景下Gradle提供``--dry-run```命令:

$ gradle build --dry-run

Tip 7: 安置項目jar包到本地Maven倉庫

$ gradle install

Tip 8:查看Gradle任務

$ gradle tasks

這個命令并不會列出所有任務。要用--all來運行:

$ gradle tasks --all

Tip 9: 使用Gradle守護程序(Daemon)

加快Gradle構建的最簡單辦法就是用Gradle守護進程進行構建。Gradle守護進程是一個長時間存活的后臺進程,在其生命周期內只執行一次引導。 默認情況下未啟用Gradle守護程序。 要使用Gradle守護進程,您可以在構建命令中使用--daemon標志。

$ gradle build --daemon

它將在3.0版本默認開啟

每次傳遞--daemon標志都很麻煩,因此您可以通過在開發機器上的~/.gradle/gradle.properties文件中添加此標志來啟用它。

org.gradle.daemon=true

Tip 10: 多線程構建

打開~/.gradle/gradle.properties并添加以下行。

org.gradle.parallel=true

Tip 11: 自定義Gradle任務

您可以通過覆蓋其doFirst和doLast生命周期方法來自定義任何Gradle任務。 讓我們假設我們想在執行測試之前和之后添加打印語句,我們可以通過以下操作:

apply plugin:'java'
test.doFirst {
    println("running tests...")
}
test.doLast {
    println("done executing tests...")
}

Tip 12: 為Gradle守護進程提供JVM參數

您可以通過在~/.gradle/gradle.properties中輸入一行來為Gradle守護程序指定JVM參數,如下所示:

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

Tip 13: 用離線模式運行

$ gradle build --offline

Tip 14: 按需配置

按需配置是Gradle的孵化功能,因此默認情況下不啟用。

$ gradle clean build --configure-on-demand

如果您希望將其設置為默認選項,則可以通過向~/.gradle/gradle.properties中添加以下代碼為全局提供此選項

org.gradle.configureondemand=true

Tip 15: 刷新Gradle依賴緩存

$ gradle clean build --refresh-dependencies

你也可以手動刪除 ~/.gradle/caches.。下一次你構建的時候它會下載所有依賴并加入到緩存中。
假設你在Gradle中用于放置jar文件的目錄為lib

dependencies {
    compile files('libs/myjar.jar')
}

也能像下面這樣做:

repositories {
   flatDir {
       dirs 'libs'
   }
}

dependencies {
   compile name: 'myjar'
}

Tip 17: 將本地目錄中的所有jar加入依賴

如果你需要把一個目錄下的所有libs加入依賴,那你就可以像下面這樣做:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

Tip 18: 構建項目和所有它所依賴的項目

$ gradle api:model:buildNeeded

Tip 19: 構建項目和所有依賴它的

$ gradle api:rest:buildDependents

Tip 20: 為構建腳本提供默認任務

為項目定義默認任務是一個很好的做法,以便初次使用者可以輕松開始您的項目。 在您的Gradle腳本中,定義defaultTasks變量來傳遞它應該執行的任務。

defaultTasks "clean","build"

現在如果一個用戶運行gradle命令,默認任務將被執行
Tip 21: 創建文件的校驗和

apply plugin: 'java'

archivesBaseName = 'checksum-sample'

jar.doLast { task ->
    ant.checksum file: task.archivePath
}

Tip 22: 給構建文件取不同的名字

默認的文件名為 build.gradle。你可以在settings.gradle用以下方法進行重命名:

rootProject.buildFileName = "gradle-tips.gradle"

現在把你的build.gradle改名成了gradle-tips.gradle

Tip 23: 在多項目Gradle工程中為構建腳本取不同的名字

為了方便,我們用build.gradle作為Gradle構建腳本的名稱。當你在多項目Gradle工程中,對構建腳本使用不同的名稱是有意義的。 我們假設我們的多模塊項目如下所示:

app
  api
  core
  web
  itests

默認情況下,所有這些子項目都將build.gradle作為他們的Gradle構建文件。 我們可以通過在settings.gradle中改變。

rootProject.children.each {
    it.buildFileName = it.name + '.gradle'
}

現在你可以用build.gradle作為根項目的構建文件而子工程中為api.gradle, core.gradle, web.gradle, 和itests.gradle

Tip 24: 使用Gradle可視化界面

你可以在命令行中用以下代碼啟動Gradle可視化界面:

$ gradle --gui

它將開啟下圖所示的可視化界面:


gradle-gui
gradle-gui

Tip 25: 創建untar任務

task untar( type : Copy) {
  from tarTree(‘dist.tar.gz’)
  into ‘destFolder’
}

Tip 26: 版本沖突時的配置

在你的構建腳本中,定義了一個如下的配置塊:

configurations {
  compile.resolutionStrategy.failOnVersionConflict()
}

Tip 27: 在Gradle中使用作用域

你可以用gradle2.12版本以上提供的compileOnly作用域來使用Maven

dependencies {
    compileOnly 'javax.servlet:servlet-api:3.0-alpha-1'
}

Tip 28: 顯式設置Java編譯編碼

在你的 build.gradle中添加如下代碼:

compileJava.options.encoding = 'UTF-8'

Tip 29: 禁用傳遞依賴關系解析

為整個配置關閉傳遞依賴關系:

configurations {
  compile.transitive = false
}

Tip 30: 查看Gradle版本

用下列代碼查看Gradle版本:

$ gradle -v
------------------------------------------------------------
Gradle 2.14.1
------------------------------------------------------------

Build time:   2016-07-18 06:38:37 UTC
Revision:     d9e2113d9fb05a5caabba61798bdb8dfdca83719

Groovy:       2.4.4
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          1.8.0_60 (Oracle Corporation 25.60-b23)
OS:           Mac OS X 10.10.5 x86_64

你可以用GradleVersion.current()查看當前Gradle版本。 你可以創建一個任務來做這個工作:

task gradleVersion {
    group = "help"
    description = "Prints Gradle version"

    doLast {
        logger.quiet("You are using [${GradleVersion.current()}]")
    }
}

當你運行時你會看到:

$ gradle gradleVersion
:gradleVersion
You are using [Gradle 2.14.1]

BUILD SUCCESSFUL

Total time: 0.667 secs

Tip 31: 禁用一個任務

taskName.enabled = false

如果你想禁用測試任務,用下列代碼:

test.enabled = false

Tip 32: 初始化Gradle項目

要創建使用testng測試框架的Java Gradle項目,您可以使用以下命令:

$ gradle init --type java-library --test-framework testng

如果你想用JUnit,那就別加上--test-framework

$ gradle init --type java-library

你也可以創建groovy和scala項目

$ gradle init --type scala-library
$ gradle init --type groovy-library

Tip 33: 簽名文件

apply plugin: 'signing'
signing {
    sign configurations.archives
}

如果你只想在發布的版本中簽名而在快照版本中不簽名,那你可以這樣做:

apply plugin: 'signing'
signing {
    required { !version.endsWith("SNAPSHOT”) }
}

Tip 34: 并行運行測試

test {
  maxParallelForks = 2
}

Tip 35: 為測試設置內存

test {
    minHeapSize = ‘512m'
    maxHeapSize = ‘1024m'
  }

Tip 36: 用任務的短名

如果你有個任務buildServerDistribution,想用它的短名,你可以用如下方法:

$ gradle bSD

你必須保證它在所有任務中是唯一的,如有另一個任務buildSafeDistribution,你需要做以下區分

$ gradle bSeD

Tip 37: 查看Gradle任務的相關信息

$ gradle help --task <task name>
$ gradle help --task dependencies

Tip 38: 用調試模式運行Gradle

$ gradle clean build --debug

Tip 39: 當任務失敗后繼續執行任務

$ gradle clean build --continue

Tip 40: 將Maven工程轉移至Gradle

到Maven項目中運行以下命令:

$ gradle init --type pom

Tip 41: 強制Gradle重運行即使它是最新的

$ gradle build --rerun-tasks

Tip 42: 在依賴中使用確切的版本號

你在聲明依賴時不要使用+號,而該用確切的版本號,這回讓你構建過程更快更安全

Tip 43: 啟用連續構建

如果你希望連續地運行構建,那你可以使用--continuous標識。它將查找文件改變,找到一處九江重新運行命令,用下列方法啟用連續測試:

$ gradle test --continuous

Tip 44: 運行一個測試事務

有時我們只需要運行一個測試事務而不是運行所有測試。用下列命令即可:

$ gradle test --tests tips.CalculatorTest

想運行CalculatorTest 中的某個部分可以這樣做:

$ gradle test --tests tips.CalculatorTest.shouldAddTwoNumbers

您還可以使用正則表達式來指定多個測試:

$ gradle test --tests "tips.Calculator*Test"

你也可以多次用--test標識

$ gradle test --tests tips.CalculatorTest --tests tips.Calculator1Test

在一個子模塊的測試中你可以這樣做:

$ gradle api:test --tests app.api.PingResourceTest

Tip 45: 生成源文件和java文檔jar包

task sourcesJar(type: Jar, dependsOn: classes) {
    classifier = 'sources'
    from sourceSets.main.allSource
}

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

artifacts {
    archives sourcesJar, javadocJar
}

Tip 46: 在構建腳本中訪問環境變量

你可以用很多方法在構建腳本中訪問環境變量:

println(System.getenv("HOME"))
println("$System.env.HOME")

Tip 47: 配置測試日志

Gradle默認只會在控制臺打印測試錯誤的日志。這會限制任務如何運行的可見性。Gradle允許你用testLogging參數來配置它。打印所有日志如下。更多信息看這里.

test {
    testLogging {
        events "passed", "skipped", "failed"
    }
}

現在當你運行./gradlew clean build時,你也會看到通過測試的日志了。

$ gradle clean test
:clean
:compileJava
:processResources UP-TO-DATE
:classes
:compileTestJava
:processTestResources UP-TO-DATE
:testClasses
:test
tips.CalculatorTest > shouldSubtractTwoNumbers PASSED

tips.CalculatorTest > shouldAddTwoNumbers PASSED

tips.CalculatorTest > shouldSubtractTwoNumbers1 PASSED

有一點要記住的是,Gradle測試命令只有當改變時才會執行。因此如果你在沒有改動的情況下再次執行它將不會有任何結果產生。你將看到:test UP-TO-DATE ,這意味著沒有檢測到改動。你可以用./gradlew cleanTest test指令強制Gradle每次都運行測試。

Tip 48: 在測試執行期間顯示標準輸出和錯誤流

test {
    testLogging {
        events "passed", "skipped", "failed"
        showStandardStreams = true
    }

}

Tip 49: 存儲憑據

您不應該在build.gradle中硬編碼憑據,而應該依靠您的用戶home~/ .gradle / gradle.properties來存儲憑據。 假設你想使用受憑證保護的Maven存儲庫。 指定憑據的一種方法是在build.gradle中對它們進行硬編碼,如下所示。

repositories {
    maven {
        credentials {
            username "admin"
            password "admin123"
        }
        url "http://nexus.mycompany.com/"
    }
}

更好的方法是改變你自己的~/ .gradle / gradle.properties

nexusUsername = admin
nexusPassword = admin123

現在,在build.gradle中引用這個

repositories {
    maven {
        credentials {
            username "$nexusUsername"
            password "$nexusPassword"
        }
        url "http://nexus.mycompany.com/"
    }
}

Tip 50: 調試Java可執行應用程序

如果將應用程序打包成可以通過Gradle運行的可執行jar,那么可以通過--debug-jvm選項來調試它。 Spring Boot應用程序作為可執行jar運行。 您可以使用gradle bootRun來運行應用程序。 要在端口5005上調試應用程序,您可以在調試模式下啟動應用程序。

$ gdw <taskname> --debug-jvm
$ gradle bootRun --debug-jvm

Tip 51: 使用本地Maven倉庫

要用本地 ~/.m2 倉庫,你需要在build.gradle中添加這些:

repositories {
    mavenLocal()
}

Tip 52: 排除傳遞性的依賴

用下述方法排除傳遞性的依賴

compile('org.hibernate:hibernate:3.1') {

  exclude module: 'cglib' //by artifact name

  exclude group: 'org.jmock' //by group

}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,800評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,755評論 2 371

推薦閱讀更多精彩內容

  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,889評論 6 342
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,604評論 25 707
  • Gradle是一款非常優秀的構建系統工具,它的DSL基于Groovy實現,可以讓你很方便的通過代碼控制這些DSL來...
    飛雪無情flysnow_org閱讀 3,540評論 0 35
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,781評論 18 139
  • 方若之回到宿舍,口袋里的手機響了起來,是室友田喜的電話,“怎么了?” “小之,就差你了,怎么還沒來?就等你了!”田...
    米玲玲玲玲閱讀 283評論 0 1