系列文章目
Gradle学习之一入门介绍
Gradle学习之二Groovy核心语法
Gradle学习之三Groovy高级语法
Gradle学习之四Gradle生命周期
Gradle学习之五Project详解
Gradle学习之六Task详解
Gradle学习之七其他重要模块
文章目录
- 系列文章目
- 前言
- 一、了解Project
- 二、Project核心api
-
- 2.1 相关API
- 2.2 Project类常用API
- 三、属性相关API
-
- 3.1 Project 默认属性
- 3.2 定义扩展属性
- 3.3 定义扩展属性二
- 四、文件属性相关操作
-
- 4.1 文件路径api
- 4.2 文件定位
- 4.3 文件拷贝
- 4.4 文件树遍历
- 五、其他API
-
- 5.1 依赖相关API
- 5.2 外部命令执行
前言
一、了解Project
虽然在项目中 AS有 Project 、 Module Library、Module App之分,但是对于Gradle来说,都是"project": 每一个module能把理解为gradle project的原因是存在build.gradle文件
Root project 管理子project。子project负责本project的文件输出,并且能够调用父project api ,管理其子project
二、Project核心api
2.1 相关API
在gradl项目中,每一个build.gradle会被编译成Project字节码,因此在其中书写内容,就相当于在Project类内部写内容。
使用build.gradle打印所有的project和所有的子project:
this.getProjects()
//project api 详解
//注意build.gradle中的方法,都是在配置阶段执行的
//要想在执行阶段执行, 需要配置task, 后面进行使用。
def getProjects(){
println '---------------'
println 'Root Project'
println '---------------'
this.getAllprojects().eachWithIndex { Project entry, int index ->
if(index == 0){
println "Root project ${entry.name}"
}else {
println "+--- project ${entry.name}"
}
}
}
this.getSubproject()
def getSubproject(){
println '---------------'
println 'Sub Project'
println '---------------'
this.getSubprojects().eachWithIndex { Project entry, int index ->
println "+--- project ${entry.name}"
}
}
使用build.gradle打印根project和父project:
this.getParentPro()
def getParentPro(){
this.getParent().each { println it.name}
}
this.getRootPro()
def getRootPro(){
println "The root is ${this.getRootProject().name}"
}
2.2 Project类常用API
在Android开发中,我们使用Gradle来配置和构建APP。接下来我们看一下Project的api在android项目中的应用。下述代码是写在项目的根build.gradle下,为子模块提供一些通用配置。
project('app'){ Project project->
apply plugin: 'com.android.application'
group 'com.zfc'
version '1.0.0'
dependencies { }
android{ }
}
//该方法用于配置当前project和子project
allprojects {
group 'com.zfc'
version '1.0.0'
}
//打印验证,是否子模块已经有上面设置的group属性了
println project('app').group
println project('baselibrary').group
//不包括当前project,只包含它的子project
//比如将子project上传的maven的配置,可以在这里进行设置
subprojects { Project project->
if(project.plugins.hasPlugin("com.android.library")){
apply from: '../publicToMaven.gradle'
}
}
三、属性相关API
3.1 Project 默认属性
public interface Project extends Comparable<Project>, ExtensionAware, PluginAware {
//gradle默认文件名
String DEFAULT_BUILD_FILE = "build.gradle";
//默认路径分隔符
String PATH_SEPARATOR = ":";
//输出的默认路径
String DEFAULT_BUILD_DIR_NAME = "build";
String GRADLE_PROPERTIES = "gradle.properties";
}
3.2 定义扩展属性
由于Project默认属性有限。我们需要定义一些扩展属性
//定义扩展属性
ext{
}
subprojects{
//每个project都定义了扩展属性
ext{
}
}
我们可以在优化一下,将ext定义在根gradle中。根属性,可以被子完全继承,可以直接使用。
最佳实践,将扩展属性单独这是在一个文件中
然后再在根gradle引用。
3.3 定义扩展属性二
还可以在gradle.properties.但是只能定义key-value的形式
//file: gradle.properties
isNeedLoadTest = false
//file: setting.gradle
include ':app',"lib_base"
//需要注意的是gradle.properties的属性 key或者value都是Object类型,需要进行一下转换
if(hasProperty('isNeedLoadTest')?isNeedLoadTest.toBoolean():false){
include ':test'
}
四、文件属性相关操作
4.1 文件路径api
println getRootDir().absoulutePath() //根工程
println getBuildDir().absolutePath() //当前位置下的build文件夹路径
println getProjectDir().absolutePath() //当前project模块
4.2 文件定位
def getContent(String path){
try{
//file 从当前位置定位文件
//project 还有 files api ,通过批量定位文件
def f = file(path)
return f.text
}catch(GradleException e){
e.printStackTrack()
}
return null
}
4.3 文件拷贝
//将当前文件的path复制都 根目录下的build的文件
copy{
from fiile('path1')
into getRootProject().getBuildDir()
//还可以排除
exclude{
}
//重命名
rename{
}
}
4.4 文件树遍历
fileTree('path'){ FileTree fileTree ->
fileTree.visit{ FileTreeElement element->
copy{
from element.file
into getRootProject().getBuildDir().path+"/test"
}
}
}
上述的文件操作,比如copy ,file等,需要在同一工程下进行操作。
五、其他API
5.1 依赖相关API
buildscript{ ScriptHandler scriptHandler->
//配置工程的仓库地址
scriptHandler.repositories{ RepositoryHandler handler->
handler.jcenter()
handler.mavenCentral()
handler.mavenLocal()
handler.ivy{
}
handler.maven{
name 'personal'
url 'http://local.....'
credenticals{
username = 'admin'
password = 'admin123'
}
}
}
//配置工程插件地址
scriptHandler.dependencies{
classpath 'com.android.tools.buid:gradle:2.2.2'
classpath 'com.tencent'
}
}
dependencies{
//文件夹 -> fileTree ,否则file
compile fileTree(include:['*.jar'],dir:'libs')
compile(){
//排除依赖
exclude module:'xxx'
exclude group:'yyyy'
//禁止传递依赖
transive false
}
}
尽量不要使用传递依赖。因为传递依赖是不确定的。
compile 完全把依赖打包进去。
provided:辅助过程,确保不会再运行时起作用才可以。
5.2 外部命令执行
如果使用外部命令
task(name: 'apkcopy'){
//doLast确保 该方法在gradle运行阶段执行
doLast{
def sourcePath = this.buildDir.path + '/outputs/apk'
def destPath = '绝对目的路径'
def cmd = 'mv -f ${sourcePath} ${destPath}'
exec{
try{
executable 'bash'
args '-c' , cmd
println 'the command is execute success.'
}catch(GradleException e){
e.printStackTrace()
println 'the command is execute failed.'
}
}
}
}
./gradlew apkcopy