gradle中的build script详解
文章目錄
- 簡介
- project和task
- 一個例子
- task詳細(xì)講解
- task腳本
- task依賴
- 動態(tài)task
- 默認(rèn)task
- build script的外部依賴
簡介
build.gradle是gradle中非常重要的一個文件,因為它描述了gradle中可以運行的任務(wù),今天本文將會帶大家體驗一下如何創(chuàng)建一個build.gradle文件和如何編寫其中的內(nèi)容。
project和task
gradle是一個構(gòu)建工具,所謂構(gòu)建工具就是通過既定的各種規(guī)則,將原代碼或者原文件通過一定的task處理過后,打包生成目標(biāo)文件的步驟。
所以我們在gradle中有兩個非常重要的概念,分別是項目和任務(wù)。
每一個gradle的構(gòu)建任務(wù)可以包含一個或者多個項目,項目可以有多種類型,比如是一個web項目或者一個java lib項目等。為了實現(xiàn)project要完成的目標(biāo),需要定義一個個的task來輔助完成目標(biāo)。
task主要用來執(zhí)行特定的任務(wù),比如編譯class文件,打包成jar,生成javadoc等等。
一個例子
接下來我們使用一個具體的例子來講解一下,gradle到底是怎么用的。
首先我們創(chuàng)建一個新的project目錄:
$ mkdir gradle-test $ cd gradle-testgradle提供了一個init方法,來方便的創(chuàng)建gradle項目的骨架,我們用下看:
gradle init Starting a Gradle Daemon (subsequent builds will be faster)Select type of project to generate:1: basic2: application3: library4: Gradle plugin Enter selection (default: basic) [1..4] 2Select implementation language:1: C++2: Groovy3: Java4: Kotlin5: Scala6: Swift Enter selection (default: Java) [1..6] 3Split functionality across multiple subprojects?:1: no - only one application project2: yes - application and library projects Enter selection (default: no - only one application project) [1..2] 1Select build script DSL:1: Groovy2: Kotlin Enter selection (default: Groovy) [1..2] 1Select test framework:1: JUnit 42: TestNG3: Spock4: JUnit Jupiter Enter selection (default: JUnit 4) [1..4] 1Project name (default: gradle-test): Source package (default: gradle.test):> Task :init Get more help with your project: https://docs.gradle.org/6.7/samples/sample_building_java_applications.htmlBUILD SUCCESSFUL in 45s 2 actionable tasks: 2 executed按照你的需要,經(jīng)過一系列的選擇之后,就可以生成一個基本的gradle項目了。
我們看下生成的文件和目錄:
. ├── app │ ├── build.gradle │ └── src │ ├── main │ │ ├── java │ │ │ └── gradle │ │ │ └── test │ │ │ └── App.java │ │ └── resources │ └── test │ ├── java │ │ └── gradle │ │ └── test │ │ └── AppTest.java │ └── resources ├── gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle14 directories, 8 files其中g(shù)radle-wrapper是幫你自動設(shè)置和安裝gradle的工具,同時它還提供了gradlew和gradlew.bat這兩個執(zhí)行文件,用來執(zhí)行g(shù)radle的任務(wù)。
我們主要看其中的兩個配置文件,settings.gradle和build.gradle。
settings.gradle中配置的是gradle中要build的項目信息:
rootProject.name = 'gradle-test' include('app')上面的例子中,rootProject.name指定了項目的名字,include(‘a(chǎn)pp’)表示需要引入一個叫做app的子項目,這個子項目中包含著實際的要打包的內(nèi)容。
再看一下app中的build.gradle文件:
plugins {// Apply the application plugin to add support for building a CLI application in Java.id 'application' }repositories {// Use JCenter for resolving dependencies.jcenter() }dependencies {// Use JUnit test framework.testImplementation 'junit:junit:4.13'// This dependency is used by the application.implementation 'com.google.guava:guava:29.0-jre' }application {// Define the main class for the application.mainClass = 'gradle.test.App' }很簡單,指定了插件,倉庫地址,依賴包和應(yīng)用程序的main class路徑。
一切準(zhǔn)備好之后,我們就可以進行構(gòu)建和運行了。
有兩種方式來運行,一種方式就是使用系統(tǒng)自帶的gradle命令,一種方式就是使用剛剛gradle為你生成的gradlew。
gradle run> Configure project :app Repository ${repo.url} replaced by $REPOSITORY_URL .> Task :app:run Hello World! gradle build> Configure project :app Repository ${repo.url} replaced by $REPOSITORY_URL .BUILD SUCCESSFUL in 2s 7 actionable tasks: 6 executed, 1 up-to-date你還可以帶上 --scan 參數(shù)將build上傳到gradle scan中,得到更加詳細(xì)的構(gòu)建分析:
./gradlew build --scanBUILD SUCCESSFUL in 0s 7 actionable tasks: 7 executedPublishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service. Do you accept these terms? [yes, no] yesGradle Terms of Service accepted.Publishing build scan... https://gradle.com/s/5u4w3gxeurtd2task詳細(xì)講解
上面的例子中,我們使用的都是gradle默認(rèn)的tasks,并沒有看到自定義task的使用,接下來我們將會探討一下,如何在build.gradle編寫自己的task。
這里我們使用的groovy來編寫build.gradle,所以我們可以像運行代碼一樣來運行它。
task腳本
先創(chuàng)建一個非常簡單的task:
task hello {doLast {println 'Hello www.flydean.com!'} }上面定義了一個名叫hello的task,并且會在執(zhí)行最后輸出 “Hello www.flydean.com!”。
我們這樣運行:
gradle -q hello Hello www.flydean.com!-q的意思是悄悄的執(zhí)行,將會忽略gradle自身的log信息。我們把要執(zhí)行的task名字寫在gradle后面就可以了。
如果你熟悉ant命令的話,可以看到gradle的task和ant很類似,不過更加的強大。
因為是groovy腳本,所以我們可以在其中執(zhí)行代碼:
task upper {doLast {String someString = 'www.flydean.com'println "Original: $someString"println "Upper case: ${someString.toUpperCase()}"} }運行結(jié)果:
> gradle -q upper Original: www.flydean.com Upper case: WWW.FLYDEAN.COM或者執(zhí)行times操作:
task count {doLast {4.times { print "$it " }} } > gradle -q count 0 1 2 3task依賴
gradle中的一個task可以依賴其他的task:
task hello {doLast {println 'Hello www.flydean.com!'} } task intro {dependsOn hellodoLast {println "I'm flydean"} }上面兩個task的順序是無關(guān)的,可以依賴的寫在前面,被依賴的寫在后面,或者反過來都成立。
動態(tài)task
除了靜態(tài)的task之外,我們還可以通過代碼來動態(tài)創(chuàng)建task:
4.times { counter ->task "task$counter" {doLast {println "I'm task number $counter"}} } > gradle -q task1 I'm task number 1我們還可以將task看做成為一個對象,調(diào)用gradle的api進行操作:
4.times { counter ->task "task$counter" {doLast {println "I'm task number $counter"}} } task0.dependsOn task2, task3上面的例子中,我們調(diào)用API手動創(chuàng)建了task之間的依賴關(guān)系:
> gradle -q task0 I'm task number 2 I'm task number 3 I'm task number 0還可以task之間的屬性調(diào)用:
task myTask {ext.myProperty = "www.flydean.com" }task printTaskProperties {doLast {println myTask.myProperty} }默認(rèn)task
如果不想每次都在調(diào)用gradle命令的時候手動指定某個具體的task名字,我們可以使用defaultTasks:
defaultTasks 'clean', 'run'task clean {doLast {println 'Default Cleaning!'} }task run {doLast {println 'Default Running!'} }task other {doLast {println "I'm not a default task!"} }上面的代碼執(zhí)行g(shù)radle和gradle clean run是相當(dāng)?shù)摹?/p>
build script的外部依賴
既然build script可以用groovy代碼來編寫,那么如果我們想要在build script中使用外部的jar包怎么辦呢?
這個時候,我們可以將外部依賴放到buildscript()方法中,后面的task就可以使用引入的依賴了:
import org.apache.commons.codec.binary.Base64buildscript {repositories {mavenCentral()}dependencies {classpath group: 'commons-codec', name: 'commons-codec', version: '1.2'} }task encode {doLast {def byte[] encodedString = new Base64().encode('hello world\n'.getBytes())println new String(encodedString)} }上面的例子中,encode使用了一個外部的依賴包Base64,這個依賴包是在buildscript方法中引入的。
本文已收錄于 http://www.flydean.com/gradle-build-script/
最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發(fā)現(xiàn)!
歡迎關(guān)注我的公眾號:「程序那些事」,懂技術(shù),更懂你!
總結(jié)
以上是生活随笔為你收集整理的gradle中的build script详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入了解gradle和maven的区别
- 下一篇: 深入理解gradle中的task