Gradle学习之五Project详解

系列文章目

Gradle学习之一入门介绍
Gradle学习之二Groovy核心语法
Gradle学习之三Groovy高级语法
Gradle学习之四Gradle生命周期
Gradle学习之五Project详解
Gradle学习之六Task详解
Gradle学习之七其他重要模块


前言

在这里插入图片描述

一、了解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 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引用。
在这里插入图片描述

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
失败的原因以及如何解决这个问题? gradle project sync失败通常是由于以下几个原因之一引起的: 1. Gradle版本不兼容:可能是项目中使用的Gradle版本与Android Studio不兼容。解决方法是在项目的build.gradle文件中将Gradle版本更改为与Android Studio兼容的版本。 2. 网络连接问题:下载Gradle文件时可能由于网络连接问题导致同步失败。解决方法是检查网络连接,并确保可以正常访问Gradle服务器。 3. 依赖项缺失:Gradle同步失败可能是由于项目的依赖项无法被解析。解决方法是在build.gradle文件中添加正确的依赖项,或者更新依赖项的版本。 4. 缓存问题:Gradle缓存可能损坏或失效,导致同步失败。解决方法是删除Gradle缓存,并重新进行同步。 以下是解决gradle project sync失败的步骤: 1. 确认Gradle版本兼容性,并在项目的build.gradle文件中将Gradle版本更改为与Android Studio兼容的版本。 2. 检查网络连接,并确保可以正常访问Gradle服务器。 3. 如果依赖项无法解析,请检查项目的依赖项,并确保它们正确添加到build.gradle文件中。 4. 如果Gradle缓存存在问题,可以尝试删除Gradle缓存。可以在以下位置找到Gradle缓存: - 在Windows上:C:\Users\<YourUsername>\.gradle\caches - 在Mac上:/Users/<YourUsername>/.gradle/caches - 在Linux上:/home/<YourUsername>/.gradle/caches 删除Gradle缓存后,重新进行同步。 请根据具体的情况,逐步尝试上述解决方法,以解决gradle project sync失败的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值