Gradle系列相關文章:
1、Gradle理論與實踐一:Gradle入門
2、Gradle理論與實踐二:Groovy介紹
3、Gradle理論與實踐三:Gradle構建腳本基礎
4、Gradle理論與實踐四:自定義Gradle插件
5、Gradle配置subprojects和allprojects的區別:subprojects和allprojects的區別
subprojects 和 allprojects 的區別,先給出結論,然後通過一個例子來佐證結論。
結論:allprojects是對所有project的配置,包括Root Project。而subprojects是對所有Child Project的配置
- 舉個例子:
新建一個test_gradle的文件夾,在文件夾裏新建build.gradle和settings.gradle文件,另外再新建兩個文件夾,名字分別爲app
lib
,如下圖所示:
在settings.gradle中寫入:
include ':app',':lib'
在build.gradle中寫入:
allprojects {
tasks.create('hello') {
doLast {
task ->
print "project name is $task.project.name \n"
}
}
}
測試一下allprojects的範圍,打開控制檯,並切換到新建的根目錄,執行gradle -q hello
命令,執行結果:
bogon:test_gradle mq$ gradle -q hello
project name is test_gradle
project name is app
project name is lib
再來測試下subprojects的作用域,打開build.gradle繼續寫入:
allprojects {
tasks.create('hello') {
doLast {
task ->
print "project name is $task.project.name \n"
}
}
}
subprojects {
hello << {
print "here is subprojects \n"
}
}
可以看到我們在下面新加了subprojects,並通過之前建的task任務hello輸出了一段字符串,繼續執行命令gradle -q hello
,執行結果:
bogon:test_gradle mq$ gradle -q hello
project name is test_gradle
project name is app
here is subprojects
project name is lib
here is subprojects
可以看到只有只有根目錄下面沒有subprojects中task的輸出,這也印證了我們上面的結論:allprojects是對所有project的配置,包括Root Project。而subprojects是對所有Child Project的配置。
進入Child Project目錄下,新建一個build.gradle文件,寫入:
hello.doLast {
print " —— I'm the app project \n"
}
繼續執行命令gradle -q hello
,執行結果:
bogon:test_gradle mq$ gradle -q hello
project name is test_gradle
project name is app
here is subprojects
—— I'm the app project
project name is lib
here is subprojects
可以看到task(hello)遍歷順序是:allprojects > subprojects > Child Project
- 額外話題:
在rootProject下的build.gradle中:buildscript的repositories和allprojects的repositories有什麼區別?如下:
//build.gradle
buildscript {
repositories {
jcenter()
google()
maven {
url 'https://maven.google.com/'
name 'Google'
}
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
}
}
allprojects {
repositories {
jcenter()
google()
maven {
url "http://maven.xxxxxxxx/xxxxx"
}
}
}
1、 buildscript裏是gradle腳本執行所需依賴,分別是對應的maven庫和插件
2、 allprojects裏是項目本身需要的依賴,比如代碼中某個類是打包到maven私有庫中的,那麼在allprojects—>repositories中需要配置maven私有庫,而不是buildscript中,不然找不到。