《Gradle 權威指南》讀書筆記——第三章 Gradle 構建腳本基礎

Setting文件
Setting.gradle,用於初始化和工程樹的配置.

//定義了兩個子項目,併爲他們指定了目錄的位置,如果不配置則默認目錄爲其同級的目錄
rootProject.name=''
include':example02'
project(':example02').projectDir=new File(rootDir,'chapter01/example2')
include':example03'
project(':example03').projectDir=new File(rootDir,'chapter01/example3')

每個Project都會有一個Build文件,RootProject也不例外.
RootProject可以獲取到所有的子項目,所以我們可以在RootProject的build中爲所有子項目統一配置,比如應用的插件,依賴的maven中心等等

subproject{  // 子項目
    apply plugin:'java'
    repositories{
        jcenter()
    }   
}
allprojects{
​
}
​

Task
創建一個Task

//其實是project.task(String taskName,Closure<> closure)
task cc {
    println "in create task"
    doFirst{
        println "doFirst"
    }
    doLast{
        println "doLast"
    }
}

任務的依賴

task cc {
    //println "cc mid"
​
    doFirst{
        println "cc doFirst"
    }
    doLast{
        println "cc doLast"
    }
}

//單個依賴

task bb(dependsOn:cc){
    doFirst{
        println "bb doFirst"
    }
    doLast{
        println "bb doLast"
    }
}

//多個依賴

task ccc{
    //println "ccc mid"
    dependsOn cc,bb
    doFirst{
        println "ccc doFirst"
    }
    doLast{
        println "ccc doLast"
    }
}

腳本語言是先聲明後使用
通過任務名操縱任務的原理是: Project 在創建任務的時候,同時把該任務對應的任務名註冊爲 Project 的屬性

自定義屬性
Project和Task都允許用戶添加額外的自定義屬性;
要添加多個自定義屬性可以通過代碼塊實現;
即是通過應用所屬的對應的 ext 屬性即可實現,添加之後可以通過對 ext 對自定義屬性讀取設置。
//project的屬性

ext.name="xiaohuang"

//閉包實現多個屬性的添加

ext{
    age=18
    num=18
}
task printExt {
    //task也有個name屬性,就是TaskName,所以需要
    println "age=$age,name=$project.name,num=$num"
}


相比局部變量,自定義屬性有更廣大的作用範圍,你可以通過跨 Project 和跨 Task 來訪問這些屬性;
自定義還可以應用在 SourceSet 中,使用 productFlavors 來定義多個渠道的時候,除了main SourceSet還會新增很多SourceSet

apply plugin:"java"
sourceSets.all{
    //爲sourceSets.中的每一個sourceSet初始化一個sourceDir屬性
    ext.sourceDir=null;
}
sourceSets{
    //創建多個sourceSet,並賦予屬性
    main{
        sourceDir="mianDir"
    }
    test{
        sourceDir="testDir"
    }
}
task pp  {
    sourceSets.each{
        println it.sourceDir
    }
}


一般可用於自定義版本號和版本名稱,我們會把它放在一個獨立的gradle文件中,便於管理

腳本即代碼,代碼即腳本
雖然Gradle是腳本,但我們需要時刻記得我們的寫的都是代碼,
所以我們可以使用Groovy、Java Gradle的任何語法和api實現我們想做的事
定義Class、內部類、導入包、定義方法、常量、接口、枚舉

def String getTime(){
    def date=new Date();
    def dateString =date.format("yyyy-MM-dd")
    return dateString
}
task pp {
    sourceSets.each{
        println it.sourceDir +getTime()
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章