每一个 build.gradle 脚本文件被 Gradle 加载解析后,都会对应生成一个 Project 对象,在脚本中的配置方法其实都对应着 Project 中的API,如果想详细了解这些脚本的配置含义,有必要对Project的属性进行学习。
下面使用一个案例来学习下project的使用方法
//获取project 的build文件夹
File bd = getBuildDir()
println "buildDir = ${bd.getAbsolutePath()}"
//获取Project的名字
String name = getName()
println "project name = $name"
//设置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'}"
}
}
//设置Project的版本号,参数可以是任何对象,gradle内部会使用 toString() 方法返回的值
setVersion(new VersionInfo("1.0.0", true))
println("project version = ${getVersion()}")
//设置Project的分组
setGroup "TestGroup"
println("project group = ${getGroup()}")
下面我们来看一下 执行结果
说明:project的都是在构建阶段执行的

project 文件操作
(1)mkdir 使用创建目录结构
File mkDir = mkdir("${buildDir}/test");
File mkDir2 = mkdir("${buildDir}/test2")
println "检测目录是否创建成功:${mkDir.exists()}, ${mkDir2.exists()}"
创建文件夹成功

(2)通过File files 定位文件//定位单个文件,参数可以是相对路径、绝对路径
File mkDir = mkdir("${buildDir}/test");
File mkDir2 = mkdir("${buildDir}/test2")
println "create File is success:${mkDir.exists()}, ${mkDir2.exists()}"
//关于文件的操作
//定位文件检测
File testDir = file("${buildDir}/test")
println "File id exists:${testDir.exists()}"
//获取文件夹下面的文件结合
FileCollection fileCollection = files("${buildDir}/test", "${buildDir}/test2")
println "-------对文件集合进行迭代--------"
fileCollection.each {File f ->
println f.name
}
println "-------文件迭代结束-------"
//获取迭代以后的文件列表
Set<File> set = fileCollection.getFiles()
println "dir has ${set.size()} file"
(3)通过fileTree创建文件树
Gradle里用 ConfigurableFileTree 来表示文件树,文件树会返回某个目录及其子目录下所有的文件,不包含目录。
下面我们来介绍下gradle中创建文件的三种方式
需要创建的三个文件
file("${buildDir}/t1.txt").createNewFile()
file("${buildDir}/test/t2.txt").createNewFile()
file("${buildDir}/t1.java").createNewFile()
1.通过一个基准目录创建文件树,参数可以是相对目录,也可以是绝对目录,与file()方法一样
ConfigurableFileTree fileTree1 = fileTree("build")
//添加包含规则
fileTree1.include "*.txt", "*/*.txt"
//添加排除规则
fileTree1.exclude "*.java"
fileTree1.each { f ->
println f
}
2.通过闭包来创建文件树
ConfigurableFileTree fileTree2 = fileTree("build") {
//配置创建包含的规则
include "*/*.txt", "*.java"
//配置排除规则
exclude "*.txt"
}
fileTree2.each { f ->
println f
}
3.通过map配置来创建文件树,可配置的选项有:dir: ''、include: '[]、exclude: []、includes: []、excludes: []
println "通过Map来创建文件树"
def fileTree3 = fileTree(dir: "build", includes: ["*/*.txt", "*.java"])
fileTree3 = fileTree(dir: "build", exclude: "*.java")
fileTree3.each { f ->
println f
}
(4)复制文件
复制文件的简单例子
task testCopyFile(type: Copy) {
//复制build目录下的所有文件
from "build"
//复制单独的某个文件
from "test.java"
//复制某个文件树下的所有文件
from fileTree("build")
include "*.txt"
include "*.java"
exclude "t1.txt"
//指定目标目录
into "outputs"
//对复制的文件重命名:通过闭包来映射
rename { fileName ->
//增加 rename_ 前缀
return fileName.endsWith(".java") ? "rename_" + fileName : fileName
}
//通过正则来映射文件名:abctest.java 会映射成 abchjy.java
rename '(.*)test(.*)', '$1hjy$2'
}
(5)删除文件
//删除 build 目录下所有文件
delete("${buildDir}")
构建脚本配置
buildscript
配置该 Project 的构建脚本的 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或者是插件的具体实现类
使用例子
//使用插件,com.android.application 就是插件id
apply plugin: 'com.android.application'
//使用插件,MyPluginImpl 就是一个Plugin接口的实现类
apply plugin: MyPluginImpl
//引用其他gradle脚本,push.gradle就是另外一个gradle脚本文件
apply from: './push.gradle'
网友评论