1. 程式人生 > >Gradle配置中subprojects 和 allprojects 的區別

Gradle配置中subprojects 和 allprojects 的區別

subprojects 和 allprojects 的區別,先給出結論,然後通過一個例子來佐證結論。

結論:allprojects是對所有project的配置,包括Root Project。而subprojects是對所有Child Project的配置

  • 舉個例子:
    新建一個test_gradle的資料夾,在資料夾裡新建build.gradle和settings.gradle檔案,另外再新建兩個資料夾,名字分別為app lib,如下圖所示:

image.png

在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 

可以看到遍歷順序是:allprojects > subprojects > Child Project