• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

Gradle学习之五Project详解

互联网 diligentman 1周前 (10-18) 11次浏览

系列文章目

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 外部命令执行

前言

Gradle学习之五Project详解

一、了解Project

Gradle学习之五Project详解
虽然在项目中 AS有 Project 、 Module Library、Module App之分,但是对于Gradle来说,都是"project": 每一个module能把理解为gradle project的原因是存在build.gradle文件
Gradle学习之五Project详解
Root project 管理子project。子project负责本project的文件输出,并且能够调用父project api ,管理其子project

二、Project核心api

Gradle学习之五Project详解

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 api
 *
 * 在根工程中管理子project (虽然能够配置子project但是不建议这么做)
 * 通过传入模块名称,获取指定模块的Gradle Project对象,从而配置它
 */
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学习之五Project详解
然后再在根gradle引用。
Gradle学习之五Project详解

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

四、文件属性相关操作

Gradle学习之五Project详解

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

Gradle学习之五Project详解

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


喜欢 (0)