毫無疑問,現(xiàn)在Gradle已經(jīng)成為java世界最火的構(gòu)建工具,風(fēng)頭已經(jīng)蓋過了冗余的ant,落后的maven。Gradle是以Groovy語言編寫的一套構(gòu)建腳本的DSL,由于Groovy語法的優(yōu)雅,所以導(dǎo)致Gradle天生就有簡潔、可讀性強(qiáng)、靈活等特性。
Gradle的命令行功能也非常強(qiáng)大。本人從maven轉(zhuǎn)到Gradle,深深被gradle強(qiáng)大的命令行功能折服。通過命令行來實(shí)現(xiàn)Gradle的各種特性,就像魔法師在表演魔法一樣。
日志輸出。 Gradle中的日期有6個(gè)層級。從高到低分別是 ERROR(錯(cuò)誤信息)、QUIET(重要信息)、WARNGING(警告信息)、LIFECYCLE(進(jìn)程信息)、INFO(一般信息)、DEBUG(調(diào)試信息)。在執(zhí)行g(shù)radle task時(shí)可以適時(shí)的調(diào)整信息輸出等級,以便更方便的觀看執(zhí)行結(jié)果。
比如一個(gè)build.gradle有這樣一個(gè)task
1 2 3 | task hello << { println 'hello world!' } |
加入-q與不加-q的輸出結(jié)果不同。
1 2 3 4 5 6 7 8 9 | $ gradle hello :hello hello world! BUILD SUCCESSFUL Total time: 3.546 secs $ gradle -q hello hello world! |
堆棧跟蹤。如果執(zhí)行g(shù)radle task失敗時(shí),如果想得到更詳細(xì)的錯(cuò)誤信息,那么就可以使用-s(或--stacktrace)來輸出詳細(xì)的錯(cuò)誤堆棧。你還可以使用-S(或--full-stacktrace)來輸出全部堆棧信息,不過一般不推薦這樣做,因?yàn)間radle是基于groovy語言,而groovy作為一門動(dòng)態(tài)語言可能會(huì)輸出與你的錯(cuò)誤代碼毫不相關(guān)的信息。
跳過指定的測試。如果你在執(zhí)行build的時(shí)候想跳過test task,那么可以使用-x命令。
1 2 3 4 5 6 7 8 9 10 11 12 | $ gradle build -x test :compileJava UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :jar UP-TO-DATE :assemble UP-TO-DATE :check :build BUILD SUCCESSFUL Total time: 3.529 secs |
繼續(xù)執(zhí)行task而忽略前面失敗的task。默認(rèn)情況下,如果有某個(gè)task失敗,后續(xù)的task就不會(huì)繼續(xù)執(zhí)行。但是有時(shí)候我們想運(yùn)行所有的task來一次性得到所有的構(gòu)建錯(cuò)誤,那么我們可以使用--continue命令。使用--continue命令后即使遇到某些task失敗也不會(huì)停止后續(xù)task的執(zhí)行。但是需要注意的是如果某個(gè)task失敗了,那么依賴于這個(gè)task的其他task依舊不會(huì)執(zhí)行,因?yàn)檫@會(huì)帶來不安全的因素。
調(diào)用task時(shí)使用短名或縮寫。如果一個(gè)task的名稱過程,那么調(diào)用時(shí)可以只輸入部分名稱即可調(diào)用,無需輸入全名。
1 2 3 | task helloWorld << { println 'hello world!' } |
比如調(diào)用helloWorld可以通過全名調(diào)用、前綴調(diào)用或首字母調(diào)用。
1 2 3 4 5 6 | $ gradle -q helloWorld hello world! $ gradle -q hell hello world! $ gradle -q hW hello world! |
使用指定的gradle文件調(diào)用task。默認(rèn)情況下,如果你調(diào)用gradle task,那么首先會(huì)尋找當(dāng)前目錄下的build.gradle文件,以及根據(jù)settings.gradle中的配置尋找子項(xiàng)目的build.gradle。但是有時(shí)候我們想指定使用某個(gè)gradle文件,那么可以使用-b命令。 比如當(dāng)前目錄有個(gè)子目錄subproject1,里面有個(gè)叫hello.gradle。
subproject1/hello.gradle
1 2 3 | task helloWorld << { println 'hello world!' } |
那么在當(dāng)前目錄可以使用以下命令調(diào)用這個(gè)task。
1 2 3 4 5 6 7 | $ gradle -b subproject1/hello.gradle helloWorld :helloWorld hello world! BUILD SUCCESSFUL Total time: 3.752 secs |
使用指定的項(xiàng)目目錄調(diào)用task。前面已經(jīng)說過,執(zhí)行g(shù)radle的task默認(rèn)會(huì)在當(dāng)前目錄尋找build.gradle及settings.gradle文件。如果我們想在任何地方執(zhí)行某個(gè)項(xiàng)目的task,那么可以使用-p來指定使用的項(xiàng)目。
1 | gradle -q -b learnGradle helloWorld |
這條命令是調(diào)用learnGradle這個(gè)項(xiàng)目下的helloWorld task。
顯示task之間的依賴關(guān)系。眾所周知,使用gradle tasks可以列出當(dāng)前所有可被使用的task,但是并沒有顯示task之間的依賴關(guān)系。我們可以加上--all來顯示 task的依賴關(guān)系。
1 2 3 4 5 6 7 8 9 10 11 | $ gradle tasks --all ……………… Other tasks ----------- task0 task1 task2 task3 ………… |
從上面可以看出task0依賴task1、task2及task3。
查看指定階段的依賴關(guān)系。使用gradle dependencies 可以查看項(xiàng)目中包的依賴關(guān)系。不過是列出了所有階段的依賴,如果項(xiàng)目中依賴復(fù)雜的話看起來有點(diǎn)頭痛。那么可以使用--configuration來查看指定階段的依賴情況。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | $ gradle -q dependencies ------------------------------------------------------------ Root project ------------------------------------------------------------ archives - Configuration for archive artifacts. No dependencies compile - Compile classpath for source set 'main'. No dependencies default - Configuration for default artifacts. No dependencies runtime - Runtime classpath for source set 'main'. No dependencies testCompile - Compile classpath for source set 'test'. \--- junit:junit:4.11 \--- org.hamcrest:hamcrest-core:1.3 testRuntime - Runtime classpath for source set 'test'. \--- junit:junit:4.11 \--- org.hamcrest:hamcrest-core:1.3 |
使用gradle -q dependencies --configuration testCompile可以只查看testComiple的依賴。
1 2 3 4 5 6 7 8 9 | $ gradle -q dependencies --configuration testCompile ------------------------------------------------------------ Root project ------------------------------------------------------------ testCompile - Compile classpath for source set 'test'. \--- junit:junit:4.11 \--- org.hamcrest:hamcrest-core:1.3 |
查看指定dependency的依賴情況。 假如我想查看項(xiàng)目中有沒有引入junit,那些階段引入了junit,那么可以使用dependecyInsight來查看。
1 2 3 4 | $ gradle dependencyInsight --dependency junit --configuration testCompile :dependencyInsight junit:junit:4.11 \--- testCompile |
注意dependencyInsight默認(rèn)只會(huì)查看compile階段的依賴,如果要查看其他階段可以使用--configuration來指定。
使用--profile命令行可以產(chǎn)生build運(yùn)行時(shí)間的報(bào)告。該報(bào)告存儲(chǔ)在build/report/profile目錄,名稱為build運(yùn)行的時(shí)間。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $ gradle build --profile :compileJava UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :jar UP-TO-DATE :assemble UP-TO-DATE :compileTestJava UP-TO-DATE :processTestResources UP-TO-DATE :testClasses UP-TO-DATE :test UP-TO-DATE :check UP-TO-DATE :build UP-TO-DATE BUILD SUCCESSFUL Total time: 3.726 secs |
然后在build/report/profile目錄下可以看到build的report。
這個(gè)報(bào)表非常有用,尤其是在在縮短build時(shí)間時(shí)可以快速定位那些耗時(shí)長的task。
試運(yùn)行build。如果你想知道某個(gè)task執(zhí)行時(shí)那些task會(huì)被一起執(zhí)行,但是你又不想真正的執(zhí)行這些task,可以使用-m來試運(yùn)行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $ gradle -m build :compileJava SKIPPED :processResources SKIPPED :classes SKIPPED :jar SKIPPED :assemble SKIPPED :compileTestJava SKIPPED :processTestResources SKIPPED :testClasses SKIPPED :test SKIPPED :check SKIPPED :build SKIPPED BUILD SUCCESSFUL Total time: 3.53 secs |
這樣我們可以一目了然的看到那些task被執(zhí)行了,又不需要花太多的時(shí)間。
Gradle的圖形界面。
其實(shí)Gradle自帶一個(gè)圖形界面來讓習(xí)慣gui操作的人來操作Gradle。打開方式很簡單。
1 | $ gradle --gui |
這樣就會(huì)彈出一個(gè)gui界面。
通過這個(gè)gui界面可以很方面的執(zhí)行g(shù)radle的各種命令,還可以將常用的命令保存為favorites。該gui的配置信息默認(rèn)被存儲(chǔ)在當(dāng)前項(xiàng)目的gradle-app.setting文件中。
注意使用gradle --gui會(huì)阻塞當(dāng)前終端,可以使用gradle --gui&來實(shí)現(xiàn)后臺(tái)運(yùn)行。
重新編譯Gradle腳本。第一次運(yùn)行Gradle命令,會(huì)在項(xiàng)目更目錄下生成一個(gè).gradle目錄來存放編譯后的腳本。只有當(dāng)構(gòu)建腳本發(fā)生修改時(shí)采用重新編譯。我們可以使用--recompile-scripts來強(qiáng)行重新編譯。