本章介紹了命令行的基本使用。正如在前面的章節(jié)里你所見(jiàn)到的調(diào)用 gradle 命令來(lái)完成一些功能。
你可以以列表的形式在命令行中一次調(diào)用多個(gè)任務(wù)。例如 gradle compile test 命令會(huì)依次調(diào)用,并且每個(gè)任務(wù)僅會(huì)被調(diào)用一次。compile 和 test 任務(wù)以及它們的依賴(lài)任務(wù)。無(wú)論它們是否被包含在腳本中:即無(wú)論是以命令行的形式定義的任務(wù)還是依賴(lài)于其它任務(wù)都會(huì)被調(diào)用執(zhí)行。來(lái)看下面的例子。
下面定義了四個(gè)任務(wù)。dist 和 test 都依賴(lài)于 compile,只用當(dāng) compile 被調(diào)用之后才會(huì)調(diào)用 gradle dist test 任務(wù)。
http://wiki.jikexueyuan.com/project/gradle/images/1-1.png" alt="" />
build.gradle
task compile << {
println 'compiling source'
}
task compileTest(dependsOn: compile) << {
println 'compiling unit tests'
}
task test(dependsOn: [compile, compileTest]) << {
println 'running unit tests'
}
task dist(dependsOn: [compile, test]) << {
println 'building the distribution'
}
gradle dist test 的輸出結(jié)果。
\> gradle dist test
:compile
compiling source
:compileTest
compiling unit tests
:test
running unit tests
:dist
building the distribution
BUILD SUCCESSFUL
Total time: 1 secs
由于每個(gè)任務(wù)僅會(huì)被調(diào)用一次,所以調(diào)用 gradle test test 與調(diào)用 gradle test 效果是相同的。
你可以用命令行選項(xiàng) -x 來(lái)排除某些任務(wù),讓我們用上面的例子來(lái)示范一下。
gradle dist -x test 的輸出結(jié)果。
\> gradle dist -x test
:compile
compiling source
:dist
building the distribution
BUILD SUCCESSFUL
Total time: 1 secs
可以看到,test 任務(wù)并沒(méi)有被調(diào)用,即使他是 dist 任務(wù)的依賴(lài)。同時(shí) test 任務(wù)的依賴(lài)任務(wù) compileTest 也沒(méi)有被調(diào)用,而像 compile 被 test 和其它任務(wù)同時(shí)依賴(lài)的任務(wù)仍然會(huì)被調(diào)用。
默認(rèn)情況下只要有任務(wù)調(diào)用失敗 Gradle 就是中斷執(zhí)行。這可能會(huì)使調(diào)用過(guò)程更快,但那些后面隱藏的錯(cuò)誤不會(huì)被發(fā)現(xiàn)。所以你可以使用--continue 在一次調(diào)用中盡可能多的發(fā)現(xiàn)所有問(wèn)題。
采用了--continue 選項(xiàng),Gralde會(huì)調(diào)用每一個(gè)任務(wù)以及它們依賴(lài)的任務(wù)。而不是一旦出現(xiàn)錯(cuò)誤就會(huì)中斷執(zhí)行。所有錯(cuò)誤信息都會(huì)在最后被列出來(lái)。
一旦某個(gè)任務(wù)執(zhí)行失敗,那么所有依賴(lài)于該任務(wù)的子任務(wù)都不會(huì)被調(diào)用。例如由于 test 任務(wù)依賴(lài)于 complie 任務(wù),所以如果 compile 調(diào)用出錯(cuò),test 便不會(huì)被直接或間接調(diào)用。
當(dāng)你試圖調(diào)用某個(gè)任務(wù)的時(shí)候,無(wú)需輸入任務(wù)的全名。只需提供足夠的可以唯一區(qū)分出該任務(wù)的字符即可。例如,上面的例子你也可以這么寫(xiě)。用 gradle di 來(lái)直接調(diào)用 dist 任務(wù)。
gradle di 的輸出結(jié)果
\> gradle di
:compile
compiling source
:compileTest
compiling unit tests
:test
running unit tests
:dist
building the distribution
BUILD SUCCESSFUL
Total time: 1 secs
你也可以用駝峰命名的任務(wù)中每個(gè)單詞的首字母進(jìn)行調(diào)用。例如,可以執(zhí)行 gradle compTest or even gradle cT 來(lái)調(diào)用 compileTest 任務(wù)。
gradle cT 的輸出結(jié)果。
\> gradle cT
:compile
compiling source
:compileTest
compiling unit tests
BUILD SUCCESSFUL
Total time: 1 secs
簡(jiǎn)化后你仍然可以使用 -x 參數(shù)。
調(diào)用 gradle 時(shí),默認(rèn)情況下總是會(huì)構(gòu)建當(dāng)前目錄下的文件,可以使用-b 參數(shù)選擇構(gòu)建的文件,并且當(dāng)你使用此參數(shù)時(shí)settings。gradle 將不會(huì)生效,看下面的例子:
subdir/myproject.gradle
task hello << {
println "using build file '$buildFile.name' in '$buildFile.parentFile.name'."
}
gradle -q -b subdir/myproject.gradle hello 的輸出結(jié)果
Output of gradle -q -b subdir/myproject.gradle hello
\> gradle -q -b subdir/myproject.gradle hello
using build file 'myproject.gradle' in 'subdir'.
另外,你可以使用 -p 參數(shù)來(lái)指定構(gòu)建的目錄,例如在多項(xiàng)目構(gòu)建中你可以用 -p 來(lái)替代 -b 參數(shù)。
gradle -q -p subdir hello 的輸出結(jié)果
\> gradle -q -p subdir hello
using build file 'build.gradle' in 'subdir'.
Gradle 提供了許多內(nèi)置任務(wù)來(lái)收集構(gòu)建信息。這些內(nèi)置任務(wù)對(duì)于了解依賴(lài)結(jié)構(gòu)以及解決問(wèn)題都是很有幫助的。
了解更多,可以參閱項(xiàng)目報(bào)告插件以為你的項(xiàng)目添加構(gòu)建報(bào)告。
執(zhí)行 gradle projects 會(huì)為你列出子項(xiàng)目名稱(chēng)列表。如下例。
gradle -q projects 的輸出結(jié)果
\> gradle -q projects
\------------------------------------------------------------
Root project
\------------------------------------------------------------
Root project 'projectReports'
+--- Project ':api' - The shared API for the application
\--- Project ':webapp' - The Web application implementation
To see a list of the tasks of a project, run gradle <project-path>:tasks
For example, try running gradle :api:tasks
這份報(bào)告展示了每個(gè)項(xiàng)目的描述信息。當(dāng)然你可以在項(xiàng)目中用 description 屬性來(lái)指定這些描述信息。
build.gradle
description = 'The shared API for the application'
執(zhí)行 gradle tasks 會(huì)列出項(xiàng)目中所有任務(wù)。這會(huì)顯示項(xiàng)目中所有的默認(rèn)任務(wù)以及每個(gè)任務(wù)的描述。如下例
gradle -q tasks的輸出結(jié)果:
\> gradle -q tasks
\------------------------------------------------------------
All tasks runnable from root project
\------------------------------------------------------------
Default tasks: dists
Build tasks
\-----------
clean - Deletes the build directory (build)
dists - Builds the distribution
libs - Builds the JAR
Build Setup tasks
\-----------------
init - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]
Help tasks
\----------
dependencies - Displays all dependencies declared in root project 'projectReports'.
dependencyInsight - Displays the insight into a specific dependency in root project 'projectReports'.
help - Displays a help message
projects - Displays the sub-projects of root project 'projectReports'.
properties - Displays the properties of root project 'projectReports'.
tasks - Displays the tasks runnable from root project 'projectReports' (some of the displayed tasks may belong to subprojects).
To see all tasks and more detail, run with --all.
默認(rèn)情況下,這只會(huì)顯示那些被分組的任務(wù)。你可以通過(guò)為任務(wù)設(shè)置 group 屬性和 description 來(lái)把 這些信息展示到結(jié)果中。
build.gradle
dists {
description = 'Builds the distribution'
group = 'build'
}
當(dāng)然你也可以用--all 參數(shù)來(lái)收集更多任務(wù)信息。這會(huì)列出項(xiàng)目中所有任務(wù)以及任務(wù)之間的依賴(lài)關(guān)系。
gradle -q tasks --all的輸出結(jié)果:
\> gradle -q tasks --all
\------------------------------------------------------------
All tasks runnable from root project
\------------------------------------------------------------
Default tasks: dists
Build tasks
\-----------
clean - Deletes the build directory (build)
api:clean - Deletes the build directory (build)
webapp:clean - Deletes the build directory (build)
dists - Builds the distribution [api:libs, webapp:libs]
docs - Builds the documentation
api:libs - Builds the JAR
api:compile - Compiles the source files
webapp:libs - Builds the JAR [api:libs]
webapp:compile - Compiles the source files
Build Setup tasks
\-----------------
init - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]
Help tasks
\----------
dependencies - Displays all dependencies declared in root project 'projectReports'.
dependencyInsight - Displays the insight into a specific dependency in root project 'projectReports'.
help - Displays a help message
projects - Displays the sub-projects of root project 'projectReports'.
properties - Displays the properties of root project 'projectReports'.
tasks - Displays the tasks runnable from root project 'projectReports' (some of the displayed tasks may belong to subprojects).
執(zhí)行 gradle help --task someTask 可以顯示指定任務(wù)的詳細(xì)信息?;蛘叨囗?xiàng)目構(gòu)建中相同任務(wù)名稱(chēng)的所有任務(wù)的信息。如下例。
gradle -q help --task libs 的輸出結(jié)果
\> gradle -q help --task libs
Detailed task information for libs
Paths
:api:libs
:webapp:libs
Type
Task (org.gradle.api.Task)
Description
Builds the JAR
這些結(jié)果包含了任務(wù)的路徑、類(lèi)型以及描述信息等。
執(zhí)行 gradle dependencies 會(huì)列出項(xiàng)目的依賴(lài)列表,所有依賴(lài)會(huì)根據(jù)任務(wù)區(qū)分,以樹(shù)型結(jié)構(gòu)展示出來(lái)。如下例。
gradle -q dependencies api:dependencies webapp:dependencies 的輸出結(jié)果
\> gradle -q dependencies api:dependencies webapp:dependencies
\------------------------------------------------------------
Root project
\------------------------------------------------------------
No configurations
\------------------------------------------------------------
Project :api - The shared API for the application
\------------------------------------------------------------
compile
\--- org.codehaus.groovy:groovy-all:2.2.0
testCompile
\--- junit:junit:4.11
\--- org.hamcrest:hamcrest-core:1.3
\------------------------------------------------------------
Project :webapp - The Web application implementation
\------------------------------------------------------------
compile
+--- project :api
| \--- org.codehaus.groovy:groovy-all:2.2.0
\--- commons-io:commons-io:1.2
testCompile
No dependencies
雖然輸出結(jié)果很多,但這對(duì)于了解構(gòu)建任務(wù)十分有用,當(dāng)然你可以通過(guò)--configuration 參數(shù)來(lái)查看 指定構(gòu)建任務(wù)的依賴(lài)情況。
gradle -q api:dependencies --configuration testCompile 的輸出結(jié)果
\> gradle -q api:dependencies --configuration testCompile
\------------------------------------------------------------
Project :api - The shared API for the application
\------------------------------------------------------------
testCompile
\--- junit:junit:4.11
\--- org.hamcrest:hamcrest-core:1.3
執(zhí)行 Running gradle dependencyInsight 可以查看指定的依賴(lài)情況。如下例。
gradle -q webapp:dependencyInsight --dependency groovy --configuration compile 的輸出結(jié)果
\> gradle -q webapp:dependencyInsight --dependency groovy --configuration compile
org.codehaus.groovy:groovy-all:2.2.0
\--- project :api
\--- compile
這對(duì)于了解依賴(lài)關(guān)系、了解為何選擇此版本作為依賴(lài)十分有用。了解更多請(qǐng)參閱依賴(lài)檢查報(bào)告。
dependencyInsight 任務(wù)是'Help'任務(wù)組中的一個(gè)。這項(xiàng)任務(wù)需要進(jìn)行配置才可以。如果用了 Java 相關(guān)的插件,那么 dependencyInsight 任務(wù)已經(jīng)預(yù)先被配置到'Compile'下了。你只需要通過(guò)'--dependency'參數(shù)來(lái)制定所需查看的依賴(lài)即可。如果你不想用默認(rèn)配置的參數(shù)項(xiàng)你可以通過(guò) '--configuration' 參數(shù)來(lái)進(jìn)行指定。了解更多請(qǐng)參閱依賴(lài)檢查報(bào)告。
執(zhí)行 gradle properties 可以獲取項(xiàng)目所有屬性列表。如下例。
gradle -q api:properties 的輸出結(jié)果
\> gradle -q api:properties
\------------------------------------------------------------
Project :api - The shared API for the application
\------------------------------------------------------------
allprojects: [project ':api']
ant: org.gradle.api.internal.project.DefaultAntBuilder@12345
antBuilderFactory: org.gradle.api.internal.project.DefaultAntBuilderFactory@12345
artifacts: org.gradle.api.internal.artifacts.dsl.DefaultArtifactHandler@12345
asDynamicObject: org.gradle.api.internal.ExtensibleDynamicObject@12345
buildDir: /home/user/gradle/samples/userguide/tutorial/projectReports/api/build
buildFile: /home/user/gradle/samples/userguide/tutorial/projectReports/api/build.gradle
--profile 參數(shù)可以收集一些構(gòu)建期間的信息并保存到 build/reports/profile 目錄下并且以構(gòu)建時(shí)間命名這些文件。
下面這份日志記錄了總體花費(fèi)時(shí)間以及各過(guò)程花費(fèi)的時(shí)間,并以時(shí)間大小倒序排列,并且記錄了任務(wù)的執(zhí)行情況。
如果采用了 buildSrc,那么在 buildSrc/build 下同時(shí)也會(huì)生成一份日志記錄記錄。
http://wiki.jikexueyuan.com/project/gradle/images/2-2.png" alt="" />
有時(shí)可能你只想知道某個(gè)任務(wù)在一個(gè)任務(wù)集中按順序執(zhí)行的結(jié)果,但并不想實(shí)際執(zhí)行這些任務(wù)。那么你可以用-m 參數(shù)。例如 gradle -m clean compile 會(huì)調(diào)用 clean 和 compile,這與 tasks 可以形成互補(bǔ),讓你知道哪些任務(wù)可以用于執(zhí)行。
在本章中你學(xué)到很多用命令行可以做的事情,了解更多你可以參閱 gradle command in 附錄 D, Gradle 命令行。