gradle構(gòu)建腳本基礎(chǔ)一

Projects 和 tasks

每一個gradle腳本都是由兩個部分組成的,projects和tasks

每一個gradle的構(gòu)建都由一個或者多個projects構(gòu)成。project表示什么完全取決于他依賴的gradle是干什么的。比如,一個project可能表示一個jar包或者一個web程序。

每一個project都由一個或者幾個task組成。一個task表示一些自動的構(gòu)建公做。這可能是一個compile任務(wù)來構(gòu)建一個jar包,或者產(chǎn)生一個javadoc文件。

動態(tài)task

4.times { counter ->
    task "task$counter" {
        doLast {
            println "I'm task number $counter"
        }
    }
}

操作已經(jīng)存在task

4.times { counter ->
    task "task$counter" {
        doLast {
            println "I'm task number $counter"
        }
    }
}
task0.dependsOn task2, task3

結(jié)果:

> gradle -q task0
I'm task number 2
I'm task number 3
I'm task number 0

增加task的行為

task hello {
    doLast {
        println 'Hello Earth'
    }
}
hello.doFirst {
    println 'Hello Venus'
}
hello.doLast {
    println 'Hello Mars'
}
hello {
    doLast {
        println 'Hello Jupiter'
    }
}

結(jié)果

> gradle -q hello
Hello Venus
Hello Earth
Hello Mars
Hello Jupiter

task的屬性

task myTask {
    ext.myProperty = "myValue"
}

task printTaskProperties {
    doLast {
        println myTask.myProperty
    }
}

結(jié)果:

> gradle -q printTaskProperties
myValue

使用ant task

task loadfile {
    doLast {
        def files = file('../antLoadfileResources').listFiles().sort()
        files.each { File file ->
            if (file.isFile()) {
                ant.loadfile(srcFile: file, property: file.name)
                println " *** $file.name ***"
                println "${ant.properties[file.name]}"
            }
        }
    }
}

結(jié)果:

> gradle -q loadfile
 *** agile.manifesto.txt ***
Individuals and interactions over processes and tools
Working software over comprehensive documentation
Customer collaboration  over contract negotiation
Responding to change over following a plan
 *** gradle.manifesto.txt ***
Make the impossible possible, make the possible easy and make the easy elegant.
(inspired by Moshe Feldenkrais)

通過hook來配置task

task distribution {
    doLast {
        println "We build the zip with version=$version"
    }
}

task release(dependsOn: 'distribution') {
    doLast {
        println 'We release now'
    }
}

gradle.taskGraph.whenReady {taskGraph ->
    if (taskGraph.hasTask(release)) {
        version = '1.0'
    } else {
        version = '1.0-SNAPSHOT'
    }
}

結(jié)果:

> gradle -q release
We build the zip with version=1.0
We release now

標(biāo)準(zhǔn)的project的屬性

image

額外的屬性

apply plugin: "java"

ext {
    springVersion = "3.1.0.RELEASE"
    emailNotification = "build@master.org"
}

sourceSets.all { ext.purpose = null }

sourceSets {
    main {
        purpose = "production"
    }
    test {
        purpose = "test"
    }
    plugin {
        purpose = "production"
    }
}

task printProperties {
    doLast {
        println springVersion
        println emailNotification
        sourceSets.matching { it.purpose == "production" }.each { println it.name }
    }
}

結(jié)果:

> gradle -q printProperties
3.1.0.RELEASE
build@master.org
main
plugin

配置任意的對象

task configure {
    doLast {
        def pos = configure(new java.text.FieldPosition(10)) {
            beginIndex = 1
            endIndex = 5
        }
        println pos.beginIndex
        println pos.endIndex
    }
}

結(jié)果:

> gradle -q configure
1
5

使用外部的腳本配置對象

task configure {
    doLast {
        def pos = new java.text.FieldPosition(10)
        // Apply the script
        apply from: 'other.gradle', to: pos
        println pos.beginIndex
        println pos.endIndex
    }
}

結(jié)果

> gradle -q configure
1
5

閉包在方法中作為最后的一個參數(shù)

在gradle中,很多地方都使用到了閉包,你能在很多地方看到,當(dāng)閉包作為最后一個一個方法參數(shù)的時候,你能夠把他放在方法的后面。

repositories {
    println "in a closure"
}
repositories() { println "in a closure" }
repositories({ println "in a closure" })

閉包代理

dependencies {
    assert delegate == project.dependencies
    testCompile('junit:junit:4.12')
    delegate.testCompile('junit:junit:4.12')
}

定義task

task(hello) {
    doLast {
        println "hello"
    }
}

task(copy, type: Copy) { //這個type是一個類型提示,可以為同樣的類型但是不同的名字的task進行配置
    from(file('srcDir'))
    into(buildDir)
}

task依賴

project('projectA') {
    task taskX(dependsOn: ':projectB:taskY') {
        doLast {
            println 'taskX'
        }
    }
}

project('projectB') {
    task taskY {
        doLast {
            println 'taskY'
        }
    }
}

結(jié)果

> gradle -q taskX
taskY
taskX
task taskX {
    doLast {
        println 'taskX'
    }
}

task taskY {
    doLast {
        println 'taskY'
    }
}

taskX.dependsOn taskY

結(jié)果:

> gradle -q taskX
taskY
taskX

使用閉包進行依賴

task taskX {
    doLast {
        println 'taskX'
    }
}

taskX.dependsOn {
    tasks.findAll { task -> task.name.startsWith('lib') }
}

task lib1 {
    doLast {
        println 'lib1'
    }
}

task lib2 {
    doLast {
        println 'lib2'
    }
}

task notALib {
    doLast {
        println 'notALib'
    }
}

結(jié)果:

> gradle -q taskX
lib1
lib2
taskX

task的執(zhí)行順序

mustRunAfter

task taskX {
    doLast {
        println 'taskX'
    }
}
task taskY {
    doLast {
        println 'taskY'
    }
}
taskY.mustRunAfter taskX

結(jié)果:

> gradle -q taskY taskX
taskX
taskY

shouldRunAfter

task taskX {
    doLast {
        println 'taskX'
    }
}
task taskY {
    doLast {
        println 'taskY'
    }
}
taskY.shouldRunAfter taskX

結(jié)果:

> gradle -q taskY taskX
taskX
taskY

如果有task的相關(guān)依賴的話,shouldRunAfter不起作用。

task taskX {
    doLast {
        println 'taskX'
    }
}
task taskY {
    doLast {
        println 'taskY'
    }
}
task taskZ {
    doLast {
        println 'taskZ'
    }
}
taskX.dependsOn taskY
taskY.dependsOn taskZ
taskZ.shouldRunAfter taskX

結(jié)果:

> gradle -q taskX
taskZ
taskY
taskX

重寫tasks

task copy(type: Copy)

task copy(overwrite: true) {
    doLast {
        println('I am the new one.')
    }
}

結(jié)果:

> gradle -q copy
I am the new one.

使用謂詞

可以使用onlyIf()方法來作為task的一個動作。task的功能只有在此動作返回為true時才會執(zhí)行,不然不會執(zhí)行。

task hello {
    doLast {
        println 'hello world'
    }
}

hello.onlyIf { !project.hasProperty('skipHello') }

結(jié)果:

> gradle hello -PskipHello
:hello world

BUILD SUCCESSFUL

Total time: 1 secs

使用StopExecutionException

如果這個throw new StopExecutionException()異常被拋出,那么task的邏輯將不會執(zhí)行。

task compile {
    doLast {
        println 'We are doing the compile.'
    }
}

compile.doFirst {
    // Here you would put arbitrary conditions in real life.
    // But this is used in an integration test so we want defined behavior.
    if (true) { throw new StopExecutionException() }
}
task myTask(dependsOn: 'compile') {
    doLast {
        println 'I am not affected'
    }
}

Enabling and disabling tasks

task disableMe {
    doLast {
        println 'This should not be printed if the task is disabled.'
    }
}
disableMe.enabled = false

結(jié)果:

:disableMe SKIPPED

BUILD SUCCESSFUL

Total time: 1 secs

更新到最新的檢查 Up-to-date checks

自定義任務(wù)類型:如果你實現(xiàn)了一個自定義的任務(wù)作為一個類,他只需要兩步就能進行構(gòu)建工作:

  1. 創(chuàng)建屬性或這個方法對你的task的輸入和輸出
  2. 增加合適的注解在每個屬性或者get方法上

gradle主要支持3種主要的輸入和輸出的分類:

  1. 簡單值:像String類型或者Number類型。更簡單的說,就是任何一種實現(xiàn)了Serialiezable的類型:
  2. 文件類型。Project.file(java.lang.Object)或者Project.file(java.lang.Object[])
  3. 內(nèi)置類型。

使用gradle.properties文件

gradle.properties:

gradlePropertiesProp=gradlePropertiesValue
sysProp=shouldBeOverWrittenBySysProp
envProjectProp=shouldBeOverWrittenByEnvProp
systemProp.system=systemValue
systemProp.https.proxyHost=www.somehost.org

build.gradle:

task printProps {
    doLast {
        println (gradlePropertiesProp)
        println envProjectProp
        println System.properties['system']
        println System.properties['https.proxyHost']
        //println systemProp.https.proxyHost
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 是什么? 在語法上是基于Groovy語言的(Groovy 是一種基于JVM的敏捷開發(fā)語言,可以簡單的理解為強類型語...
    千山萬水迷了鹿閱讀 99,980評論 4 122
  • 參考資料:http://gold.xitu.io/post/580c85768ac247005b5472f9htt...
    zhaoyubetter閱讀 11,247評論 0 6
  • 前言 學(xué)習(xí)gradle這個想法在我開始使用AndroidStudio之后就有了,基本上每個開始使用AndroidS...
    AnAppleADie閱讀 3,746評論 2 19
  • 前言 從2013年Google推出Android Studio(后面以AS簡稱)開始,到現(xiàn)在已經(jīng)歷經(jīng)3年,版本也發(fā)...
    dfqin閱讀 1,965評論 1 3
  • Gradle簡介 Gradle是一個構(gòu)建工具,同時它也是一個編程框架。 當(dāng)你把Gradle當(dāng)構(gòu)建工具看的時候,我們...
    Rangethan閱讀 2,390評論 1 8

友情鏈接更多精彩內(nèi)容