Gradle学习笔记

这篇博客详细记录了Gradle的使用心得,包括在aaa文件夹的build.gradle配置文件中的实践操作,涵盖了Gradle的基本构建流程和核心特性。
摘要由CSDN通过智能技术生成

下面笔记中的代码都是在aaa文件夹中的build.gradle文件中写的

// Gradle学习笔记
// Gradle里的任何东西都是基于两个基本概念:projects(项目)和tasks(任务).
// 每一个构建都是由一个或多个projects构成的。每一个project是由一个或多个tasks构成的。
// 一个task代表一些更加细化的构建,可能是编译一些classes、创建一个jar或者生成某个目录的压缩文件等。

/********************************************************************/

// 通过gradle命令可以运行一个Gradle构建,gradle命令会在当前目录中查找build.gradle文件,我们称该文件为一个构建脚本(build script),
// 但是严格来说它是一个构建配置脚本,这个脚本定义了一个project和它的tasks。
task hello { // 定义一个独立的task,叫做hello,并且加入了一个action,该action包含了一些groovy代码的闭包
	doLast {
		println 'Hello world!'
	}
}

// 命令行里进入脚本所在文件夹输入 gradle -q hello 执行叫做hello的task,也就是执行了上面定义的action:
// #补充#命令行里的 -q 代表quite模式,它不会生成Gradle的日志信息,所以只能看到task的输出,它使得输出更加清晰。
/**********输出结果*************/
//Hello world!
/**********输出结果*************/

/********************************************************************/

// 定义了一个叫做hello2的任务,该任务是一个可以执行的闭包。
// 该例子把doLast替换成 <<,它俩功能一样。
task hello2 << { 
	println 'hello world'
}
/**********输出结果*************/
//hello world
/**********输出结果*************/

/********************************************************************/

// 任务依赖
task water << {
	println 'water'
}

task fish(dependsOn: water) << {
	println 'fish depend on water'
}

// 执行 gradle -q fish
/**********输出结果*************/
//water
//fish depend on water
/**********输出结果*************/
// haha依赖于hehe,所以执行haha时,hehe任务会被优先执行来作为执行haha任务的条件。

/********************************************************************/

// 在加入一个依赖之前,这个所依赖的任务不需要提前定义
task dog(dependsOn: 'food') << { // 依赖于暂未定义的任务时单引号不能省略
	println 'dog depend on food'
}

task food << {
	println 'food'
}

// 执行 gradle -q dog
/**********输出结果*************/
//food
//dog depend on food
/**********输出结果*************/

/********************************************************************/

// 动态任务
4.times { // times表示从0开始循环到(4 - 1)即3
	number ->
		task "task$number" << {
			println "I am task number $number"
		}
}

// 执行 gradle -q task3
/**********输出结果*************/
//I am task number 3
/**********输出结果*************/

/********************************************************************/

// 使用已经存在的任务

task0.dependsOn task2, task3 // 给创建好的任务添加依赖

// 执行 gradle -q task0
/**********输出结果*************/
//I am task number 2
//I am task number 3
//I am task number 0
/**********输出结果*************/

task zhangsan << {
	println "I'm zhangsan"
}

zhangsan.doFirst { // 给创建好的任务添加行为
	println 'My first name is zhang'
}

zhangsan.doLast {
	println 'My last name is san'
}

zhangsan << {
	println "I'm the best"
}

// 执行 gradle -q zhangsan
/**********输出结果*************/
//My first name is zhang
//I'm zhangsan
//My last name is san
//I'm the best
/**********输出结果*************/
// doFirst和doLast可以被执行许多次,它们分别可以在任务动作列表的开始和结束加入动作,
// 当任务执行的时候,在动作列表里的动作将被按顺序执行。

/********************************************************************/

// 任务属性
task taskP << {
	println 'hello'
}

taskP.doLast {
	println "the task name is $taskP.name" // 这里的name是任务的默认属性,代表当前任务的名称
}

// 执行 gradle -q taskP
/**********输出结果*************/
//hello
//the task name is taskP
/**********输出结果*************/

// 自定义任务属性
task myTask {
	ext.myProperty = "myValue" // 自定义属性并赋初始值
}

task printTaskProperties << {
	println myTask.myProperty // 像任务默认属性那样读取属性
}

// 执行 gradle -q printTaskProperties
/**********输出结果*************/
//myValue
/**********输出结果*************/

/********************************************************************/

// 默认任务
// 例子:Gradle允许在脚本中定义一个或多个默认任务
defaultTasks 'default1', 'default2'

task default1 << {
	println 'default task default1'
}

task default2 << {
	println 'default task default2'
}

task other << {
	println "I'm not a default task"
}

// 执行 gradle -q // 等价于 gradle -q default1 default2
/**********输出结果*************/
//default task clean
//default task run
/**********输出结果*************/
// 在一个多项目构建中,每一个子项目都可以有它特别的默认任务
// 如果一个子项目没有特别的默认任务,父项目的默认任务将会被执行

/********************************************************************/

// 通过DAG配置
// Gradle有一个配置阶段和执行阶段。在配置阶段后,Gradle将会知道应执行的所有任务
// Gradle为你提供了一个“钩子”,以便利用这些信息。
// 例子:判断发布的任务是否在要执行的任务当中,根据该判断可以给任务中的一些变量指定不同的值

task debug << {
	println "the debug version is $version"
}

task release(dependsOn: debug) << {
	println "the release version is $version"
}

gradle.taskGraph.whenReady {
	it ->
		if (it.hasTask(release)) {
			version = 'beta1.0'
		} else {
			version = 'alpha1.0'
		}
}

// 执行 gradle -q release
/**********输出结果*************/
//the debug version is beta1.0
//the release version is beta1.0
/**********输出结果*************/
// 最重要的是whenReady在release任务执行之前就已经影响了release任务。
// 因为该方法是在解析任务后、执行任务前执行的

/********************************************************************/

// Java插件
// Java插件是基于合约的,这意味着插件已经给项目的许多方面定义了默认的参数,比如Java源文件的位置,
// 如果在项目中遵从这些合约,则写构建脚本时不需要在里面加入太多东西。

// 例子:一个基础的Java项目
apply plugin: 'java' // 加入该代码就可以使用Java插件
// 它会把Java插件加入到你的项目中,这意味着许多预定制的任务被自动加入到了你的项目里
// Gradle希望能在 src/main/java 找到你的源代码,在 src/test/java 找到测试代码,也就是说Gradle默认地
// 在这些路径里查找资源。另外,任何在 src/main/resources 目录下的文件都将被包含在JAR文件里,同时任何
// 在 src/test/resources 目录下的文件会被加入到 classpath 中以运行测试代码。所有的输出文件将会被创建
// 在构建目录里,JAR文件存放在 build/libs 文件夹里。

// 建立项目
// Java插件在你的项目里加入了许多任务。然而你只会用到其中的一小部分任务。最常用的任务是 build 任务,
// 它会建立你的项目。当你运行 gradle build 命令时,Gradle将会编译和测试你的代码,并且创建一个包含类
// 和资源的JAR文件。
// 执行 gradle build
/**********输出结果*************/
//:compileJava UP-TO-DATE
//:processResources UP-TO-DATE
//:classes UP-TO-DATE
//:jar
//:assemble
//:compileTestJava UP-TO-DATE
//:processTestResources UP-TO-DATE
//:testClasses UP-TO-DATE
//:test UP-TO-DATE
//:check UP-TO-DATE
//:build
//
//BUILD SUCCESSFUL
//
//Total time: 38.093 secs
/**********输出结果*************/

// 其余一些有用的任务是:
// clean
// 删除 build 生成的目录和所有生成的文件

// assemble
// 编译并打包你的代码,但是并不运行单元测试。其他插件会在这个任务里加入更多的东西。如你使用War插件,
// 这个任务将根据你的项目生成一个WAR文件。

// check
// 编译并测试你的代码。其他的插件会加入更多的检查步骤。如你使用checkstyle插件,这个任务将会运行Checkstyle来检查你的代码

/********************************************************************/

// 外部的依赖
// 通常,一个Java项目有许多外部的依赖,即是指外部的JAR文件。为了在项目里面引入这些JAR文件,你需要告诉Gradle
// 去哪里找它们。在Gradle中,JAR文件位于一个仓库中,这里的仓库类似于MAVEN的仓库,仓库可以被用来提取依赖,或者
// 放入一个依赖,或者两个皆可。如我们将使用开放的Maven仓库:
// 例子:加入Maven仓库
repositories {
	mavenCentral()
}
// Gradle是怎样找到那些外部依赖的文件的呢?Gradle会在一个repository(仓库)里找到这些文件。仓库其实就是文件的集合,
// 通过group,name,version整理分类。默认地,Gradle不提前定义任务仓库,在使用外部依赖之前,需要至少定义一个库。
// Gradle能解析好几种不同的仓库形式,如本地文件系统或者http,使用本地Ivy目录:
/*
repositories {
	ivy {
		url "../local-repo"
	}
}
// 使用远程Ivy仓库:
repositories {
	ivy {
		url "http://repo.mycompany.com/repo"
	}
}
*/
// 一个项目可以有好几个库,Gradle会根据依赖定义的顺序在各个库里寻找它们,在第一个库里找到了就不会再在第二个仓库里找它了

// 接下来让我们加入一些依赖。这里假设我们的项目在编译阶段有一些依赖:
// 例子:加入依赖
dependencies {
	// 引用一个外部依赖需要使用group,name和version属性。有一种简写形式,只使用一串字符串"group:name:version"
	// 如:'commons-collections:commons-collections:3.2'
	compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
	testCompile group: 'junit', name: 'junit', version: '4.+'
}
// 可以看到commons-collections被加入到了编译阶段,junit也被加入到了测试编译阶段。
// 这个构建脚本声明commons-collections 3.2最终被用来编译项目的源代码。言外之意是在运行阶段
// 需要commons-collections和它的依赖。构建脚本同样声明了需要junit >=4.0的版本来编译项目测试。
// 它告诉Gradle到Maven中央仓库里找任何需要的依赖。

// 依赖配置
// 在Gradle里,依赖可以组合成配置。Java插件定义了许多标准的配置:
// compile : 用来编译项目源代码的依赖
// runtime : 在运行时被生成的类使用的依赖。默认的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值