Gradle Project學(xué)習(xí)

每一個 build.gradle 腳本文件被 Gradle 加載解析后,都會對應(yīng)生成一個 Project 對象,在腳本中的配置方法其實都對應(yīng)著 Project 中的API,如果想詳細(xì)了解這些腳本的配置含義,有必要對Project的屬性進行學(xué)習(xí)。
下面使用一個案例來學(xué)習(xí)下project的使用方法
//獲取project 的build文件夾

File bd = getBuildDir()
println "buildDir = ${bd.getAbsolutePath()}"

//獲取Project的名字
String name = getName()
println "project name = $name"

//設(shè)置Project的描述信息
setDescription "this is gradle test"
//獲取Project的描述信息
String desc = getDescription()
println "project description = $desc"

//獲取Project的路徑
String path = getPath();
println "project path = $path"

class VersionInfo {
    String version
    boolean release

    VersionInfo(String v, boolean release) {
        version = v
        this.release = release
    }

    String toString() {
        return "V-${version}-${release ? 'release' : 'debug'}"
    }
}
//設(shè)置Project的版本號,參數(shù)可以是任何對象,gradle內(nèi)部會使用 toString() 方法返回的值
setVersion(new VersionInfo("1.0.0", true))
println("project version = ${getVersion()}")

//設(shè)置Project的分組
setGroup "TestGroup"
println("project group = ${getGroup()}")

下面我們來看一下 執(zhí)行結(jié)果
說明:project的都是在構(gòu)建階段執(zhí)行的


image.png

project 文件操作

(1)mkdir 使用創(chuàng)建目錄結(jié)構(gòu)

File mkDir = mkdir("${buildDir}/test");
File mkDir2 = mkdir("${buildDir}/test2")
println "檢測目錄是否創(chuàng)建成功:${mkDir.exists()}, ${mkDir2.exists()}"

創(chuàng)建文件夾成功


image.png

(2)通過File files 定位文件//定位單個文件,參數(shù)可以是相對路徑、絕對路徑

File mkDir = mkdir("${buildDir}/test");
File mkDir2 = mkdir("${buildDir}/test2")
println "create File is success:${mkDir.exists()}, ${mkDir2.exists()}"
//關(guān)于文件的操作
//定位文件檢測
File testDir = file("${buildDir}/test")
println "File id  exists:${testDir.exists()}"

//獲取文件夾下面的文件結(jié)合
FileCollection fileCollection = files("${buildDir}/test", "${buildDir}/test2")
println "-------對文件集合進行迭代--------"
fileCollection.each {File f ->
    println f.name
}
println "-------文件迭代結(jié)束-------"
//獲取迭代以后的文件列表
Set<File> set = fileCollection.getFiles()
println "dir has ${set.size()} file"

(3)通過fileTree創(chuàng)建文件樹
Gradle里用 ConfigurableFileTree 來表示文件樹,文件樹會返回某個目錄及其子目錄下所有的文件,不包含目錄。
下面我們來介紹下gradle中創(chuàng)建文件的三種方式
需要創(chuàng)建的三個文件

file("${buildDir}/t1.txt").createNewFile()
file("${buildDir}/test/t2.txt").createNewFile()
file("${buildDir}/t1.java").createNewFile()

1.通過一個基準(zhǔn)目錄創(chuàng)建文件樹,參數(shù)可以是相對目錄,也可以是絕對目錄,與file()方法一樣


ConfigurableFileTree fileTree1 = fileTree("build")
//添加包含規(guī)則
fileTree1.include "*.txt", "*/*.txt"
//添加排除規(guī)則
fileTree1.exclude "*.java"
fileTree1.each { f ->
    println f
}

2.通過閉包來創(chuàng)建文件樹

ConfigurableFileTree fileTree2 = fileTree("build") {
    //配置創(chuàng)建包含的規(guī)則
    include "*/*.txt", "*.java"
    //配置排除規(guī)則
    exclude "*.txt"
}
fileTree2.each { f ->
    println f
}

3.通過map配置來創(chuàng)建文件樹,可配置的選項有:dir: ''、include: '[]、exclude: []、includes: []、excludes: []

println "通過Map來創(chuàng)建文件樹"
def fileTree3 = fileTree(dir: "build", includes: ["*/*.txt", "*.java"])
fileTree3 = fileTree(dir: "build", exclude: "*.java")
fileTree3.each { f ->
    println f
}

(4)復(fù)制文件
復(fù)制文件的簡單例子

task testCopyFile(type: Copy) {
    //復(fù)制build目錄下的所有文件
    from "build"
    //復(fù)制單獨的某個文件
    from "test.java"
    //復(fù)制某個文件樹下的所有文件
    from fileTree("build")

    include "*.txt"
    include "*.java"
    exclude "t1.txt"
    //指定目標(biāo)目錄
    into "outputs"

    //對復(fù)制的文件重命名:通過閉包來映射
    rename { fileName ->
        //增加 rename_ 前綴
        return fileName.endsWith(".java") ? "rename_" + fileName : fileName
    }

    //通過正則來映射文件名:abctest.java 會映射成 abchjy.java
    rename '(.*)test(.*)', '$1hjy$2'
}

(5)刪除文件
//刪除 build 目錄下所有文件
delete("${buildDir}")

構(gòu)建腳本配置

buildscript

配置該 Project 的構(gòu)建腳本的 classpath,在 Andorid Studio 中的 root project 中可以看到:

buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
    }
}
apply
apply(options: Map<String, ?>)

我們通過該方法使用插件或者是其他腳本,options里主要選項有:

(1)from: 使用其他腳本,值可以為 Project.uri(Object) 支持的路徑
(2)plugin:使用其他插件,值可以為插件id或者是插件的具體實現(xiàn)類

使用例子

//使用插件,com.android.application 就是插件id
apply plugin: 'com.android.application'
//使用插件,MyPluginImpl 就是一個Plugin接口的實現(xiàn)類
apply plugin: MyPluginImpl

//引用其他gradle腳本,push.gradle就是另外一個gradle腳本文件
apply from: './push.gradle'
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容