Gradle學習(二):你應該記住的Gradle

Gradle是基於Groovy語言的DSL,用於項目構建。與Ant和Maven相比的優點在於自己是一門語言,能夠作一些特定邏輯,靈活許多java

Gradle生命週期

Gradle生命週期分爲三個階段:react

1.初始化階段:生成project對象android

2.配置階段:生成task對象,並完成task拓撲圖markdown

3.執行階段:執行任務以及依賴的全部任務app

生命週期相關API:gradle

//配置階段開始前
this.beforeEvalute{
	//doSomething
}
//配置階段完成後,即生成了task拓撲圖後
this.afterEvalute{
	//doSomething
}
//gradle執行完成後,task執行完後
this.gradle.buildFinished{	
	//doSomething
}
//等同於this.beforeEvaluate
this.gradle.beforeProject{}
//等同於this.afterEvaluate
this.gradle.afterProject{}
//初始化階段
setting.gradle文件腳本內容便是在初始化階段執行的
複製代碼

Project

AndroidStudio中每一個Module就是Project,每一個Module都有相應的build.gradle文件ui

Project相關APIthis

//獲取全部Project
this.getAllProjects()
//獲取全部子Project
this.getSubProjects()
//獲取根Project
this.getRootProject()
//獲取父Project
this.getParent()
根據路徑獲取Project
project('app') {
Project project -> 
	println project.name
	apply plugin: 'com.android.application'
	android{
		//相關配置
	}
}

//配置全部Project
allprojects {
	//配置全部project
	group 'com.breeze'
	version '1.0.0'
}
subprojects {
	apply from 'common.gradle'
}
//判斷是不是庫工程
project.plugins.hasPlugin('com.android.library')
複製代碼

Project屬性相關APIgoogle

每一個Project都有一個ext能夠存放本身定義的屬性lua

寫法

ext {
	Version = '1.0.0'
	compileVersion = 28
}
腳本中使用ext.Version便可
複製代碼

注意點:根Project的屬性默認子Project是繼承的,因而當要給全部的project配置屬性時,只須要在根Project配置便可 項目中使用,能夠將配置抽取到一個文件中,再在根Project中引進該文件 如android中將配置抽取到common.gradle

ext {
    android = [
            compileSdkVersion : 28,
            applicationId : "com.sq.sqpackartifact",
            minSdkVersion : 19,
            targetSdkVersion: 28,
            versionCode: 1,
            versionName: "1.0"
    ]

    libs = [
            kotlinStdLib : "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version",
            supportAppCompatLib : "com.android.support:appcompat-v7:28.0.0",
            okhttpLib : "com.squareup.okhttp3:okhttp:3.12.0",
            okhttpLogLib: 'com.squareup.okhttp3:logging-interceptor:3.8.1',
            gsonLib : "com.google.code.gson:gson:2.8.5",
            retrofitLib : "com.squareup.retrofit2:retrofit:2.5.0",
            retrofitRxJavaLib : "com.squareup.retrofit2:adapter-rxjava:2.5.0",
            retrofitGsonLib : "com.squareup.retrofit2:converter-gson:2.5.0",
            rxAndroidLib : "io.reactivex:rxandroid:1.2.1",
            rxKotlinLib : "io.reactivex:rxkotlin:1.0.0"
    ]
}
複製代碼

根project中引入該文件

apply from: 'common.gradle'
複製代碼

子project中使用:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation rootProject.ext.libs.kotlinStdLib
    implementation rootProject.ext.libs.supportAppCompatLib
    //okhttp
    implementation rootProject.ext.libs.okhttpLib
    implementation rootProject.ext.libs.okhttpLogLib

    //gson
    implementation rootProject.ext.libs.gsonLib
    //retrofit
    implementation rootProject.ext.libs.retrofitLib
    implementation rootProject.ext.libs.retrofitRxJavaLib
    implementation rootProject.ext.libs.retrofitGsonLib
    //rx
    implementation rootProject.ext.libs.rxAndroidLib
    implementation rootProject.ext.libs.rxKotlinLib
    //download
    implementation project(path: ':download')
}
複製代碼

Task

定義Task

方法一:

task helloTask(group:'breeze', description:'task study') {
        println 'hello'
    }
複製代碼

上述其實是調用了task('taskName', closure)建立task 方法二: tasks是TaskContainer,是task的管理類,上面定義task的方式實際上也是由TaskContainer管理的

this.tasks.create(name: 'helloTask2') {
        setGroup('breeze')
        setDescription('task study'')
        println 'i am task'
    }
複製代碼
Task生命週期
task A {
    println 'task a config'
    doFirst {
        println 'task a doFirst'
    }
    doLast {
        println 'task a doLast'
    }
}
複製代碼

上述代碼中的執行順序是 config->doFirst->doLast這樣,而且config是在project的生命週期的第二個步驟配置task時執行的

Task依賴

在這裏插入圖片描述 圖中是執行build命令時gradle執行的一系列task 達到該效果,須要使用task的DependsOn方法 使用dependsOn方法給A任務添加依賴task B,在執行A時就會先執行B

task A(dependsOn:'B') {
	doLast {
        println 'task a execute'
	}
}

task B {
	doLast{
		println 'task b execute'
	}
}
//也能夠寫成
task A {
    doLast {
        println 'task a execute'
	}
}

task B {
    doLast{
		println 'task b execute'
	}
}

project.afterEvaluate {
    tasks.getByName('A').dependsOn('B')
}
複製代碼

另外和依賴相關的還有兩個方法,mustDoAfter, ShouldDoAfter,和DependsOn不一樣的是這兩個只是影響執行順序

task A {
    doLast {
        println 'task a execute'
    }
}

task B {
    shouldRunAfter 'A'
    doLast {
        println 'task b execute'
    }
}
複製代碼

任務A,B仍然能夠單獨執行,並不會由於shouldRunAfter而在執行B時先去執行A 但當任務都進行時,執行順序就會變化了,不管是執行gradlew A B仍是執行gradlew B A都是先執行A再執行B的 mustRunAfter和shouldRunAfter做用基本一致,惟一的不一樣點是,當任務循環時,shouldRunAfter要求沒那麼嚴格,能夠忽略

相關文章
相關標籤/搜索