每一個 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í)行的

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)建文件夾成功

(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'