gradle文档学习
基础学习
构建生命周期
构建过程
- 初始化
- 配置
- 执行
Settings file
除了build script file。Gradle还定义了一个设定文件。
setting file在初始化阶段进行。一个多项目构建必须在多项目工程的根目录有有settings.gradle。因为它定义了那些项目参与到多项目构建中。对于单一项目工程,settingfile 是可选的。除了定义包含的工程,你需要将lib添加到你的build script 的classpath中。
对于build script,属性设置和方法调用代理给了一个project对象。类似的,settings file的属性设置和方法代理给了一个settings对象。
初始化
如果你执行了不带settings.gradle文件的Gradle项目,Gradle将以下面的方式来寻找setting.gradle文件:
- 在父目录中寻找setting.gradle
- 如果没有找到,将使用以单项目的方式来构建
- 如果找到了,Gradle将检查当前项目是否是以setting.gradle中定义的多项目结构的成员。如果不是,将用单项目的方式执行,否则运行多项目构建。
Gradle为参与构建的每个项目创建Project对象。对于多项目构建,它们是那些定义在Settings object中的。
组织Gradle项目
分开不同语言的源代码
分开不同类型的测试源文件
通常项目定义并且执行不同类型的测试,比如单元测试,系统测试,功能测试或者冒烟测试。在最优的情况下,每个类型的测试代码应当被存储在目标明确的源目录。分开的测试源代码有利于维护并且便于区分你运行测试的目的
尽量使用标准约定
总是定义settings file
gradle在每次构建调用中总是尝试定位settings.gradle或settings.gradle.kts。运行时系统遍历目录树直到根目录。这个算法一旦找到settings文件就停止。
使用buildSrc 来抽象关键逻辑
buildSrc 被当做是included build。在发现目录的基础上,Gradle编译和测试这部分代码,并且将它放在你的build script 的classpath中。对于多项目构建,只能有一个在根目录下的buildSrc目录。buildSrc更推荐,因为它比script插件更好维护和测试。
buildSrc对于Java和Groovy项目应用相同的源码约定。它也提供GradleAPIde的直接访问,附加的依赖通常被直接在buildSrc的build.gradle中声明。
在gradle.peroperties文件中声明属性
在命令行的点对点场景中声明属性很常见。例如,你想在某次构建中传递一个特定的属性来控制运行时行为。
避免重叠的任务输出
混合或者覆写项目不同任务折衷书输出文件的最新检查会导致更慢的编译。反过来,这些系统变化会有影响gradle构建的缓存的识别和缓存那些不是可缓存任务的
标准化构建自定义Gradle distribution
初始化脚本能够在一条机器上将构建逻辑非常简单地应用到所有项目。
以下是创建创建一个自定义gradle流程的步骤:
- 实现下载和重新打包gradle的逻辑
- 使用需要的逻辑定义一个或多个initalization scripts
- 将initialization scripts和gradle distribution d打包
- 上传到HTTPServer
- 更改所有项目指向到上传的Gradle distribution URL
plugins {
id 'base'
}
// This is defined in buildSrc
import org.gradle.distribution.DownloadGradle
version = '0.1'
tasks.register('downloadGradle', DownloadGradle) {
description = 'Downloads the Gradle distribution with a given version.'
gradleVersion = '4.6'
}
tasks.register('createCustomGradleDistribution', Zip) {
description = 'Builds custom Gradle distribution and bundles initialization scripts.'
dependsOn downloadGradle
def projectVersion = project.version
archiveFileName = downloadGradle.gradleVersion.map { gradleVersion ->
"mycompany-gradle-${gradleVersion}-${projectVersion}-bin.zip"
}
from zipTree(downloadGradle.destinationFile)
from('src/init.d') {
into "${downloadGradle.distributionNameBase.get()}/init.d"
}
}
I'm a fucKing fake coder!