作為Android開發(fā)你必須明白的Gradle基礎(chǔ)
作為一個(gè)Android開發(fā)程序員蹬挤,如果你的
build.gradle
都只能靠IDE生成或者從別的項(xiàng)目中復(fù)制粘貼來完成,那么你該好好的看完這篇文章,掌握一下你不知道的Gradle基礎(chǔ)运吓。
文中的圖片均來自于網(wǎng)絡(luò)演闭,侵刪
Gradle是一個(gè)基于JVM的構(gòu)建工具肤晓,目前Android Studio中建立的工程都是基于gradle進(jìn)行構(gòu)建的耀盗。Gradle的與其他構(gòu)建工具(ant、maven)的特性主要包括:
- 強(qiáng)大的DSL和豐富的gradle的API
- gradle就是groovy
- 強(qiáng)大的依賴管理
- 可拓展性
- 與其他構(gòu)建工具的集成
三種構(gòu)建腳本
Gradle的腳本都是配置型腳本房匆。每一種腳本類型實(shí)際上都是某個(gè)具體的gradle的API中的類對(duì)象的委托耸成,腳本執(zhí)行對(duì)應(yīng)的其實(shí)是其委托的對(duì)象的配置。在一個(gè)完整的gradle的構(gòu)建體系中浴鸿,總共有三種類型的構(gòu)建腳本井氢,同時(shí)也分別對(duì)應(yīng)著三種委托對(duì)象
腳本類型 | 委托對(duì)象 |
---|---|
Init script | Gradle |
Settings script | Settings |
Build script | Project |
init.gradle
對(duì)應(yīng)的就是上面的Init script,實(shí)際上就是Gradle
對(duì)象的委托岳链,所以在這個(gè)init 腳本中調(diào)用的任何屬性引用以及方法花竞,都會(huì)委托給這個(gè) Gradle
實(shí)例。
Init script的執(zhí)行發(fā)生在構(gòu)建開始之前掸哑,也是整個(gè)構(gòu)建最早的一步约急。
配置Init scrip的依賴
每個(gè)腳本的執(zhí)行都可以配置當(dāng)前腳本本身執(zhí)行所需要的依賴項(xiàng)。Init scrip的配置如下:
// initscript配置塊包含的內(nèi)容就是指當(dāng)前腳本本身的執(zhí)行所需要的配置
// 我們可以在其中配置比如依賴路徑等等
initscript {
repositories {
mavenCentral()
}
dependencies {
classpath group: 'org.apache.commons', name: 'commons-math', version: '2.0'
}
}
使用Init scrip
要使用一個(gè)定義好的Init scrip苗分,主要有以下幾個(gè)方式
-
在執(zhí)行g(shù)radle命令的時(shí)候厌蔽,通過
-I
或--init-script
命令選項(xiàng)指定腳本的路徑這種方式可以針對(duì)具體的一次構(gòu)建。
把一個(gè)
init.gradle
文件放到*USER_HOME*/.gradle/
目錄-
把一個(gè)文件名以
.gradle
結(jié)尾的文件放到Gradle 分發(fā)包*GRADLE_HOME*/init.d/
目錄內(nèi)以上的兩種方式是全局的摔癣,對(duì)機(jī)器內(nèi)的構(gòu)建都會(huì)起作用
settings.gradle
對(duì)應(yīng)的是Settings script腳本類型奴饮,是Settings
對(duì)象的委托。在 腳本中調(diào)用的任何屬性引用以及方法供填,都會(huì)委托給這個(gè) Settings
實(shí)例拐云。
Settings script的執(zhí)行發(fā)生在gradle的構(gòu)建生命周期中的初始化階段罢猪。Settings腳本文件中聲明了構(gòu)建所需要的配置近她,并用以實(shí)例化項(xiàng)目的層次結(jié)構(gòu)。在執(zhí)行settings腳本并初始化Settings
對(duì)象實(shí)例的時(shí)候膳帕,會(huì)自動(dòng)的構(gòu)建一個(gè)根項(xiàng)目對(duì)象rootProject
并參與到整個(gè)構(gòu)建當(dāng)中粘捎。(rootProject
默認(rèn)的名稱就是其文件夾的名稱,其路徑就是包含setting腳本文件的路徑)危彩。
下面是一張關(guān)于Settings
對(duì)象的類圖:
每一個(gè)通過include
方法被添加進(jìn)構(gòu)建過程的project
對(duì)象攒磨,都會(huì)在settings腳本中創(chuàng)造一個(gè)ProjectDescriptor
的對(duì)象實(shí)例。
因此汤徽,在settings的腳本文件中娩缰,我們可以訪問使用的對(duì)象包括:
-
Settings
對(duì)象 -
Gradle
對(duì)象 -
ProjectDescriptor
對(duì)象
獲取settings文件
在gradle中,只要根項(xiàng)目/任何子項(xiàng)目的目錄中包含有構(gòu)件文件谒府,那么就可以在相應(yīng)的位置運(yùn)行構(gòu)建拼坎。而判斷一個(gè)構(gòu)建是否是多項(xiàng)目的構(gòu)建浮毯,則是通過尋找settings腳本文件,因?yàn)樗甘玖俗禹?xiàng)目是否包含在多項(xiàng)目的構(gòu)建中泰鸡。
查找settings文件的步驟如下:
- 在與當(dāng)前目錄同層次的master目錄中搜索setting文件
- 如果在1中沒有找到settings文件债蓝,則從當(dāng)前目錄開始在父目錄中查找settings文件。
當(dāng)找到settings文件并且文件定義中包含了當(dāng)前目錄盛龄,則當(dāng)前目錄就會(huì)被認(rèn)為是多項(xiàng)目的構(gòu)建中的一部分饰迹。
build.gradle
對(duì)應(yīng)的就是前面提到的Build script腳本類型,是gradle中Project
對(duì)象的委托余舶。在腳本中調(diào)用的任何屬性引用以及方法啊鸭,都會(huì)委托給這個(gè) Project
實(shí)例。
配置腳本依賴
在build.gradle文件中有一個(gè)配置塊buildScipt{}
是用于配置當(dāng)前腳本執(zhí)行所需的路徑配置等的(與initScript形似)欧芽。
buildscript {
// 這里的repositories配置塊要與Project實(shí)例當(dāng)中的repositories區(qū)分開來
// 這里的repositories配置是指腳本本身依賴的倉庫源莉掂,其委托的對(duì)象實(shí)際上是ScriptHandler
repositories {
mavenLocal()
google()
jcenter()
}
// 與前面的repositories配置塊相同,也要與Project當(dāng)中的dependencies配置塊區(qū)分開來
dependencies {
classpath 'com.android.tools.build:gradle:3.1.2'
}
}
這里補(bǔ)充關(guān)鍵的一點(diǎn)千扔,在
build.gradle
文件中憎妙,不管buildScript{}
配置塊被放在哪個(gè)位置,它總是整個(gè)腳本文件中最先被執(zhí)行的
三個(gè)構(gòu)建塊
每個(gè)gradle構(gòu)建都包含三個(gè)基本的構(gòu)件塊:
- project
- task
- property
每個(gè)構(gòu)建包含至少一個(gè)project曲楚,進(jìn)而又包含一個(gè)或者多個(gè)task厘唾。project和task暴露的屬性(property)可以用來控制構(gòu)建。
Project
我們對(duì)project的理解更多來源于項(xiàng)目目錄中的build.gradle
文件(因?yàn)樗鋵?shí)就是project對(duì)象的委托)龙誊。Project
對(duì)象的類圖如下所示:
項(xiàng)目配置
在build.gradle腳本文件中抚垃,我們不僅可以對(duì)單獨(dú)project進(jìn)行配置,也可以定義project塊的共有邏輯等趟大,參考下面的定義鹤树。
常見的例子比如:
// 為所有項(xiàng)目添加倉庫源配置
allprojects {
repositories {
jcenter()
google()
}
}
// 為所有子項(xiàng)目添加mavenPublish的配置塊
subprojects {
mavenPublish {
groupId = maven.config.groupId
releaseRepo = maven.config.releaseRepo
snapshotRepo = maven.config.snapshotRepo
}
}
Task
任務(wù)是gradle構(gòu)建的基礎(chǔ)配置塊之一,gradle的構(gòu)建的執(zhí)行就是task的執(zhí)行逊朽。下面是task的類圖罕伯。
task的配置和動(dòng)作
當(dāng)我們定一個(gè)一個(gè)task的時(shí)候,會(huì)包含配置和動(dòng)作兩部分的內(nèi)容叽讳。比如下面的代碼示例:
task test{
println("這是配置")
doFirst{
// do something here
}
doLast(){
// do something here
}
}
目前task的動(dòng)作(action)聲明主要包含兩個(gè)方法:
- doFirst
- doLast
這些動(dòng)作是在gradle的構(gòu)建生命周期中的執(zhí)行階段被調(diào)用追他。值得注意的是,一個(gè)task可以聲明多個(gè)doFirst
和doLast
動(dòng)作岛蚤。也可以為一些已有的插件中定義的task添加動(dòng)作邑狸。比如:
// 為test任務(wù)添加一個(gè)doLast的動(dòng)作
test.doLast{
// do something here
}
在task的定義之中,除了動(dòng)作塊以外的是配置塊涤妒,我們可以聲明變量单雾、訪問屬性、調(diào)用方法等等。這些配置塊的內(nèi)容發(fā)生在gradle的構(gòu)建生命周期中的配置階段硅堆。因此task中的配置每次都會(huì)被執(zhí)行蜂奸。(動(dòng)作塊只有在實(shí)際發(fā)生task的調(diào)用的時(shí)候才會(huì)執(zhí)行)。
task的依賴
gradle中任務(wù)的執(zhí)行順序是不確定的硬萍。通過task之間的依賴關(guān)系扩所,gradle能夠確保所依賴的task會(huì)被當(dāng)前的task先執(zhí)行。使用task的dependsOn()
方法朴乖,允許我們?yōu)閠ask聲明一個(gè)或者多個(gè)task依賴祖屏。
task first{
doLast{
println("first")
}
}
task second{
doLast{
println("second")
}
}
task third{
doLast{
println("third")
}
}
task test(dependsOn:[second,first]){
doLast{
println("first")
}
}
third.dependsOn(test)
task的類型
默認(rèn)情況下,我們常見的task都是org.gradle.api.DefaultTask
類型买羞。但是在gradle當(dāng)中有相當(dāng)豐富的task類型我們可以直接使用袁勺。要更改task的類型,我們可以參考下面的示例
task createDistribution(type:Zip){
}
更多關(guān)于task的類型畜普,可以參考gradle的官方文檔
Property
屬性是貫穿在gradle構(gòu)建始終的期丰,用于幫助控制構(gòu)建邏輯的存在。gradle中聲明屬性主要有以下兩種方式:
- 使用ext命名空間定義拓展屬性
- 使用gradle屬性文件
gradle.properties
定義屬性
ext命名空間
Gradle中很多模型類都提供了特別的屬性支持吃挑,比如Project
.在gradle內(nèi)部钝荡,這些屬性會(huì)以鍵值對(duì)的形式存儲(chǔ)。使用ext命名空間舶衬,我們可以方便的添加屬性埠通。下面的方式都是支持的:
//在project中添加一個(gè)名為groupId的屬性
project.ext.groupId="tech.easily"
// 使用ext塊添加屬性
ext{
artifactId='EasyDependency'
config=[
key:'value'
]
}
值得注意的是,只有在聲明屬性的時(shí)候我們需要使用
ext
命名空間逛犹,在使用屬性的時(shí)候端辱,ext
命名空間是可以省略的。
屬性文件
正如我們經(jīng)常在Android項(xiàng)目中看到的虽画,我們可以在項(xiàng)目的根目錄下新建一個(gè)gradle.properties
文件舞蔽,并在文件中定義簡(jiǎn)單的鍵值對(duì)形式的屬性。這些屬性能夠被項(xiàng)目中的gradle腳本所訪問码撰。如下所示:
# gradle.properties
# 注意文件的注釋是以#開頭的
groupId=tech.easily
artifactId=EasyDependency
有的時(shí)候渗柿,我們可能需要在代碼中動(dòng)態(tài)的創(chuàng)建屬性文件并讀取文件中的屬性(比如自定義插件的時(shí)候),我們可以使用java.util.Properties
類灸拍。比如:
void createPropertyFile() {
def localPropFile = new File(it.projectDir.absolutePath + "/local.properties")
def defaultProps = new Properties()
if (!localPropFile.exists()) {
localPropFile.createNewFile()
defaultProps.setProperty("debuggable", 'true')
defaultProps.setProperty("groupId", GROUP)
defaultProps.setProperty("artifactId", project.name)
defaultProps.setProperty("versionName", VERSION_NAME)
defaultProps.store(new FileWriter(localPropFile), "properties auto generated for resolve dependencies")
} else {
localPropFile.withInputStream { stream ->
defaultProps.load(stream)
}
}
}
關(guān)于屬性很重要的一點(diǎn)是屬性是可以繼承的做祝。在一個(gè)項(xiàng)目中定義的屬性會(huì)自動(dòng)的被其子項(xiàng)目繼承砾省,不管我們是用以上哪種方式添加屬性都是適用的鸡岗。
構(gòu)建生命周期
前面提及到了gradle中多種腳本類型,并且他們都在不同的生命周期中被執(zhí)行编兄。
三個(gè)階段
在gradle構(gòu)建中轩性,構(gòu)建的生命周期主要包括以下三個(gè)階段:
-
初始化(Initialization)
如前文所述队询,在這個(gè)階段,settings腳本會(huì)被執(zhí)行蛉签,從而Gradle會(huì)確認(rèn)哪些項(xiàng)目會(huì)參與構(gòu)建拒迅。然后為每一個(gè)項(xiàng)目創(chuàng)建
Project
對(duì)象。 -
配置(Configuration)
配置 Initialization 階段創(chuàng)建的
Project
對(duì)象卸察,所有的配置腳本都會(huì)被執(zhí)行脯厨。(包括Project
中定義的task的配置塊也都會(huì)被執(zhí)行) -
執(zhí)行(Configuration)
這個(gè)階段Gradle會(huì)確認(rèn)哪些在 Configuration 階段創(chuàng)建和配置的 Task 會(huì)被執(zhí)行,哪些 Task會(huì)被執(zhí)行取決于
gradle
命令的參數(shù)以及當(dāng)前的目錄坑质,確認(rèn)之后便會(huì)執(zhí)行
監(jiān)聽生命周期
在gradle的構(gòu)建過程中合武,gradle為我們提供了非常豐富的鉤子,幫助我們針對(duì)項(xiàng)目的需求定制構(gòu)建的邏輯涡扼,如下圖所示:
要監(jiān)聽這些生命周期稼跳,主要有兩種方式:
- 添加監(jiān)聽器
- 使用鉤子的配置塊
關(guān)于可用的鉤子可以參考Gradle
和Project
中的定義,常用的鉤子包括:
Gradle
-
beforeProject()/afterProject()
等同于
Project
中的beforeEvaluate
和afterEvaluate
-
settingsEvaluated()
settings腳本被執(zhí)行完畢吃沪,
Settings
對(duì)象配置完畢 -
projectsLoaded()
所有參與構(gòu)建的項(xiàng)目都從settings中創(chuàng)建完畢
-
projectsEvaluated()
所有參與構(gòu)建的項(xiàng)目都已經(jīng)被評(píng)估完
TaskExecutionGraph
-
whenReady()
task圖生成汤善。所有需要被執(zhí)行的task已經(jīng)task之間的依賴關(guān)系都已經(jīng)確立
Project
- beforeEvaluate()
- afterEvaluate()
依賴管理
在前面提及的Gradle的主要特性之中,其中的一點(diǎn)就是強(qiáng)大的依賴管理票彪。Gradle中具備豐富的依賴類型红淡,兼容多種依賴倉庫。同時(shí)Gradle中的每一項(xiàng)依賴都是基于特定的范圍(scope)進(jìn)行分組管理的降铸。
在gradle中添加為項(xiàng)目添加依賴的方式如下所示:
// build.gradle
// 添加依賴倉庫源
repositories {
google()
mavenCentral()
}
// 添加依賴
// 依賴類型包括:文件依賴锉屈、項(xiàng)目依賴、模塊依賴
dependencies {
// local dependencies.
implementation fileTree(dir: 'libs', include: ['*.jar'])
...
}
四種依賴類型
Gradle中的依賴類型有四類:
-
模塊依賴
這是gradle中比較常見的依賴類型垮耳, 它通常指向倉庫中的一個(gè)構(gòu)件颈渊,如下所示:
dependencies { runtime group: 'org.springframework', name: 'spring-core', version: '2.5' runtime 'org.springframework:spring-core:2.5', 'org.springframework:spring-aop:2.5' runtime( [group: 'org.springframework', name: 'spring-core', version: '2.5'], [group: 'org.springframework', name: 'spring-aop', version: '2.5'] ) runtime('org.hibernate:hibernate:3.0.5') { transitive = true } runtime group: 'org.hibernate', name: 'hibernate', version: '3.0.5', transitive: true runtime(group: 'org.hibernate', name: 'hibernate', version: '3.0.5') { transitive = true } }
模塊依賴對(duì)應(yīng)于gradle的API中的
ExternalModuleDependency
對(duì)象 -
文件依賴
dependencies { runtime files('libs/a.jar', 'libs/b.jar') runtime fileTree(dir: 'libs', include: '*.jar') }
-
項(xiàng)目依賴
dependencies { compile project(':shared') }
項(xiàng)目依賴對(duì)應(yīng)于gradle的API中的
ProjectDependency
對(duì)象 -
特定的Gradle發(fā)行版依賴
dependencies { compile gradleApi() testCompile gradleTestKit() compile localGroovy() }
管理依賴配置
gradle中項(xiàng)目的每一項(xiàng)依賴都是應(yīng)用于一個(gè)特定的范圍的,在gradle中用 Configuration
對(duì)象表示终佛。每一個(gè)Configuration
對(duì)象都會(huì)有一個(gè)唯一的名稱俊嗽。Gradle的依賴配置管理如下所示:
自定義Configuration
在gradle中,自定義Configuration
對(duì)象是非常簡(jiǎn)單的铃彰,同時(shí)定義自己的Configuration
對(duì)象的時(shí)候绍豁,也可以繼承于已有的Configuration
對(duì)象,如下所示:
configurations {
jasper
// 定義繼承關(guān)系
smokeTest.extendsFrom testImplementation
}
repositories {
mavenCentral()
}
dependencies {
jasper 'org.apache.tomcat.embed:tomcat-embed-jasper:9.0.2'
}
管理傳遞性依賴
在實(shí)際的項(xiàng)目依賴管理中存在這樣的一種依賴關(guān)系:
- 模塊b依賴于模塊c
- 模塊a依賴于模塊b
- 模塊c成為了模塊a的傳遞依賴
在處理上面這種傳遞性依賴的時(shí)候牙捉,gradle提供了強(qiáng)大的管理功能
使用依賴約束
依賴約束可以幫助我們控制傳遞性依賴以及自身的依賴的版本號(hào)(版本范圍)竹揍,比如:
dependencies {
implementation 'org.apache.httpcomponents:httpclient'
constraints {
// 這里httpclient是項(xiàng)目本身的依賴
// 這個(gè)約束表示,不管是項(xiàng)目本身的依賴是還是傳遞依賴都強(qiáng)制使用這個(gè)指定的版本號(hào)
implementation('org.apache.httpcomponents:httpclient:4.5.3') {
because 'previous versions have a bug impacting this application'
}
// commons-codec并沒有被聲明為項(xiàng)目本身的依賴
// 所以僅當(dāng)commons-codec是傳遞性依賴的時(shí)候這段邏輯才會(huì)被觸發(fā)
implementation('commons-codec:commons-codec:1.11') {
because 'version 1.9 pulled from httpclient has bugs affecting this application'
}
}
}
排除特定的傳遞性依賴
有的時(shí)候邪铲,我們所依賴的項(xiàng)目/模塊會(huì)引入多個(gè)傳遞性依賴芬位。而其中部分的傳遞性依賴我們是不需要的,這時(shí)候可以使用exclude
排除部分的傳遞性依賴带到,如下所示:
dependencies {
implementation('log4j:log4j:1.2.15') {
exclude group: 'javax.jms', module: 'jms'
exclude group: 'com.sun.jdmk', module: 'jmxtools'
exclude group: 'com.sun.jmx', module: 'jmxri'
}
}
強(qiáng)制使用指定的依賴版本
Gradle通過選擇依賴關(guān)系圖中找到的最新版本來解決任何依賴版本沖突昧碉。 可是有的時(shí)候,某些項(xiàng)目會(huì)需要使用一個(gè)較老的版本號(hào)作為依賴。這時(shí)候我們可以強(qiáng)制指定某一個(gè)版本被饿。例如:
dependencies {
implementation 'org.apache.httpcomponents:httpclient:4.5.4'
// 假設(shè)commons-codec的最新版本是1.10
implementation('commons-codec:commons-codec:1.9') {
force = true
}
}
要注意的是四康,如果依賴項(xiàng)目中使用了新版本才有的api,而我們強(qiáng)制使用了舊版本的傳遞依賴之后狭握,會(huì)引起運(yùn)行時(shí)的錯(cuò)誤
禁止傳遞性依賴
dependencies {
implementation('com.google.guava:guava:23.0') {
transitive = false
}
}
在android plugin升級(jí)到3.0以后闪金,提供了一種新的依賴配置項(xiàng)implement,它的作用就是解決了依賴傳遞性的問題论颅。模塊本身的依賴并不會(huì)暴露給被引用的項(xiàng)目
依賴關(guān)系解析
使用依賴關(guān)系解析規(guī)則
依賴關(guān)系解析規(guī)則提供了一種非常強(qiáng)大的方法來控制依賴關(guān)系解析過程毕泌,并可用于實(shí)現(xiàn)依賴管理中的各種高級(jí)模式。比如:
-
統(tǒng)一構(gòu)件組的版本
很多時(shí)候我們依賴一個(gè)公司的庫會(huì)包含多個(gè)module嗅辣,這些module一般都是統(tǒng)一構(gòu)建撼泛、打包和發(fā)布的,具備相同的版本號(hào)澡谭。這個(gè)時(shí)候我們可以通過控制依賴關(guān)系的解析過程做到版本號(hào)統(tǒng)一愿题。
configurations.all { resolutionStrategy.eachDependency { DependencyResolveDetails details -> if (details.requested.group == 'org.gradle') { details.useVersion '1.4' details.because 'API breakage in higher versions' } } }
-
處理自定義的版本scheme
configurations.all { resolutionStrategy.eachDependency { DependencyResolveDetails details -> if (details.requested.version == 'default') { def version = findDefaultVersionInCatalog(details.requested.group, details.requested.name) details.useVersion version.version details.because version.because } } } def findDefaultVersionInCatalog(String group, String name) { //some custom logic that resolves the default version into a specific version [version: "1.0", because: 'tested by QA'] }
關(guān)于更多依賴關(guān)系解析規(guī)則的使用實(shí)例可以參考gradle的API中的 ResolutionStrategy
使用依賴關(guān)系的替代規(guī)則
依賴關(guān)系的替換規(guī)則和上面的依賴關(guān)系解析規(guī)則有點(diǎn)相似。實(shí)際上蛙奖,依賴關(guān)系解析規(guī)則的許多功能可以通過依賴關(guān)系替換規(guī)則來實(shí)現(xiàn)潘酗。依賴關(guān)系的替換規(guī)則允許項(xiàng)目依賴(Project Dependency)和模塊依賴(Module Dependency)被指定的替換規(guī)則透明地替換。
// 使用項(xiàng)目依賴替換模塊依賴
configurations.all {
resolutionStrategy.dependencySubstitution {
substitute module("org.utils:api") with project(":api") because "we work with the unreleased development version"
substitute module("org.utils:util:2.5") with project(":util")
}
}
// 使用模塊依賴替換項(xiàng)目依賴
configurations.all {
resolutionStrategy.dependencySubstitution {
substitute project(":api") with module("org.utils:api:1.3") because "we use a stable version of utils"
}
}
除了上面兩種之外雁仲,還有其他三種的依賴關(guān)系規(guī)則處理仔夺。因?yàn)闆]有實(shí)際使用過,這里不過多闡述攒砖,想了解更多可以查看官方的文檔Customizing Dependency Resolution Behavior
- 使用組件元數(shù)據(jù)(meta-data)規(guī)則
- 使用組件選擇規(guī)則
- 使用模塊更換規(guī)則
插件開發(fā)
插件開發(fā)是gradle靈活的構(gòu)建體系中的一個(gè)強(qiáng)大工具缸兔。通過gradle中的Plugin
API,我們可以自定義插件吹艇,把一些通用的構(gòu)建邏輯插件化并廣泛的運(yùn)用惰蜜。比如Android項(xiàng)目中都會(huì)使用的:com.android.application
,kotlin-android
,java
等等。
網(wǎng)上關(guān)于插件開發(fā)的文章已經(jīng)很多受神,這里不再贅述抛猖。這里推薦我寫的一個(gè)Gradle插件,也是在我完全看了gradle的官方文檔之后鼻听,結(jié)合前面提及到的依賴管理的知識(shí)寫的:
-
一個(gè)幫助提高組件化開發(fā)效率的gradle插件财著,提供的功能包括:
- 發(fā)布模塊的構(gòu)件都遠(yuǎn)程maven倉庫
- 動(dòng)態(tài)更換依賴配置:對(duì)模塊使用源碼依賴或者maven倉庫的構(gòu)件(aar/jar)依賴
寫在最后
全文基本是在看了gradle的官方文檔及相關(guān)資料之后,按照自己的思路的整理和總結(jié)撑碴。關(guān)于gradle的使用和問題歡迎一起討論撑教。