Gradle学习之五Project详解

   日期:2020-10-18     浏览:89    评论:0    
核心提示:文章目录前言一、了解Project二、Project核心api前言一、了解Project虽然在项目中 AS有 Project 、 Module Library、Module App之分,但是对于Gradle来说,都是"project": 每一个module能把理解为gradle project的原因是存在build.gradle文件Root project 管理子project。子project负责本project的文件输出,并且能够调用父project api ,管理其子project.

系列文章目

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

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服