進行本章節的學習,請按照我提供的方式進行食用效果會更佳哦!android
好了,下面請享用api
project至關於Android中的activity的入口同樣,是構建gradle程序的入口,下面讓咱們來學習一下吧!閉包
在gradle中Android工程中的每個module都是一個project,咱們能夠經過執行gradlew projects來查看,其實執行的project命令就是執行了一個Task任務,天然而然的就執行了gradle的生命週期。
注意:判斷是否是一個gradle的project的關鍵就是是否包含build.gradle文件,若是將build.gradle文件刪除掉,那麼這個目錄就至關於一個普通的文件夾,只不過存放了大量的文件而已。
gradle中的project是經過樹管理結構的方式來管理全部的子project,雖說子project能夠繼續嵌套project,可是常規的寫法中不建議再繼續嵌套,一個子project就是一個輸出。app
在瞭解project的api以前,咱們先看下圖,瞭解下project api的組成部分maven
經過此圖,咱們發現project api是由6部分組成,那麼咱們在學習的時候就能夠經過分組的方式進行學習。 咱們按照顏色來區分每一個部分的做用(紫色、綠色、橙色、黃色)//獲取相關中的全部project,至關於gradlew projects的操做
this.getAllprojects()
複製代碼
下面經過腳本的方式一樣能夠輸出全部的projects內容,等價於getAllprojects方法學習
getProjects()
def getProjects(){
println '--------------------'
println 'Root Projects'
println '--------------------'
println '--------------------'
this.getAllprojects().eachWithIndex{ Project project, int i ->
if (i==0){
println "Root Projects ':${project.name}'"
}else {
println "+--- project ':${project.name}' "
}
}
}
複製代碼
想要讓上面的腳本生效,咱們只須要隨便執行一個task便可,好比gradlew clean操做,結果以下:gradle
此時咱們已經獲取到了getProjects方法中的內容getSubProjects()
def getSubProjects() {
println '--------------------'
println 'Sub Projects'
println '--------------------'
println '--------------------'
this.getAllprojects().eachWithIndex { Project project, int i ->
println "+--- project ':${project.name}' "
}
}
複製代碼
在每一個module的build.gradle中執行上述代碼,看下會輸出什麼?ui
----------------------------分割線----------------------------
剛纔咱們說了如何獲取子project,如今咱們看下如何獲取到父project,代碼奉上:this
/** * 獲取父project name * @return */
def getParentProject(){
def name=this.getParent().name
println "the parent project name is :${name}"
}
複製代碼
Q:在每一個build.gradle文件中操做後你會發現,當你在root project(即項目頂層)中的build.gradle執行該方法的時候會報錯,緣由是什麼呢?spa
A:緣由就是它已是頂級容器了,沒有父類了,因此再去獲取它的頂級固然就是不存在了的。
下面咱們再來一個獲取頂級project
/** * 獲取頂級Project name * @return */
def getRootPro(){
def name=this.getRootProject().name
println "the parent project name is :${name}"
}
複製代碼
Q:爲何getParent獲取的時候會有null的存在,而getRootProject卻不會有null的現象?
A:緣由其實在文章的最開始就已經提到過了,由於project是已樹的形式進行管理,當樹達到根節點的時候,固然就沒有節點了,此時固然就是null了,而getRootProject一直獲取的都是根節點,固然能夠獲取到啦。
上面咱們說過根工程能夠管理咱們全部的子工程,那麼能不能在根工程經過具體的api去配置子工程呢?
注意:如下代碼都在根project中執行
project(){}
源碼解析:
path:要操做子project的路徑
configureClosure:閉包參數,爲指定路徑的project指定參數,閉包的參數就是當前的project
Project project(String path, Closure configureClosure);
project('app') { Project pro ->
println pro.name
//指定輸出
apply plugin: 'com.android.application'
//指定組
group 'com.test'
//指定版本號
version '1.0.0-release'
//指定依賴
dependencies {}
android {}
}
複製代碼
由於閉包參數是Project,那麼咱們獲取Project的信息進行指定 上面的
apply plugin: 'com.android.application'
dependencies {}
android {}
複製代碼
這個是否是很眼熟呢?沒錯就是在每一個子project的build.gradle中都有的內容,那麼咱們如今能夠這樣操做,將這些配置都放到根project進行配置,而後刪除子build.gradle中這三個屬性,只要你願意,在根工程中能夠完成子project中的配置(不建議)。
若是全部的project中都須要的配置,爲防止咱們代碼的重複編寫,咱們一般都在根工程中配置好,而gradle也爲咱們提供了一個對象的api
//配置當前節點工程和其餘subproject的全部project
allprojects(){}
void allprojects(Closure configureClosure);
複製代碼
那麼下列代碼咱們更改成:
project('app') { Project pro ->
//指定輸出
apply plugin: 'com.android.application'
//指定組
group 'com.test'
//指定版本號
version '1.0.0-release'
//指定依賴
dependencies {}
android {}
}
project('submodule') { Project pro ->
//指定輸出
apply plugin: 'com.android.application'
//指定組
group 'com.test'
//指定版本號
version '1.0.0-release'
//指定依賴
dependencies {}
android {}
}
複製代碼
上面的代碼咱們指定了相同的幾個屬性,apply、group、version,那麼咱們能夠抽離出,代碼以下:
project('app') { Project pro ->
//指定依賴
dependencies {}
android {}
}
project('submodule') { Project pro ->
//指定依賴
dependencies {}
android {}
}
allprojects {
apply plugin: 'com.android.application'
//指定組
group 'com.test'
//指定版本號
version '1.0.0-release'
}
複製代碼
咱們有了對全部工程配置的操做的api屬性,那麼有沒有隻有對其子project配置操做的api呢?
別急,你能想到的gradle早就爲你準備好了,那麼請靜靜食用吧
//只包含子工程
subprojects { Project pro ->
//庫工程 添加上傳maven倉庫配置
if (pro.plugins.hasPlugin('com.android.library')) {
apply from: '../publishToMaven.gradle'
}
}
複製代碼
固然關於project的學習還未結束,本節只是講解了project api的部份內容,未完待續……