via: https://tianyu94.com/2019/06/...
- Make the impossible possible, make the possible easy, and make the easy elegant
- Gradle is Groovy
- Minimize Coupling, Maximize Cohesion
Task 任务
task helloWorld {
doLast {
println 'Hello world~'
}
}
$ gradle -q helloWorld
Hello world~
-q
quiet 只输出 task 的相关信息
- 每个新建的 task 默认都是
DefaultTask
类,标准的Task
实现。
结合函数方法
task startTask {
doLast {
hello()
}
}
def hello() {
println 'Hello~'
}
$ gradle startTask
Hello~
动态 task
3.times {
task 'repeatTask$it' {
println 'I am repeat task'
}
}
// 指定此 task 需依赖 repeatTask0
task groupTherapy(dependsOn: repeatTask0)
$ gradle groupTherapy
:repeatTask0
I am repeat task
:repeatTask1
I am repeat task
:repeatTask2
I am repeat task
$ gradle groupTherapy -x repeatTask1
:repeatTask0
I am repeat task
:repeatTask2
I am repeat task
-x
排除指定 task
$ gradle repeatTask0 groupTherapy
:repeatTask0
I am repeat task
:repeatTask1
I am repeat task
:repeatTask2
I am repeat task
执行多个 task,且每个 task 仅执行一次
给现有的 task 添加动作
task printVersion {
doFirst {
println 'Version 0.1 in doFirst'
}
doLast {
println 'Version 0.1 in doLast'
}
}
printVersion.doFirst { println 'First action' }
printVersion.doLast { println 'Last action' }
$ gradle printVersion
First action
Version 0.1 in doFirst
Version 0.1 in doLast
Last action
设置描述和分组
task myTask {
group = 'group1'
description = 'I am myTask of group1'
}
// or
task myTask(group: 'group1',
description: 'I am myTask of group1') {
// ...
}
依赖多个 task
task myTask(dependsOn: [otherTask1, otherTask2]) {
// ...
}
注意,若执行 myTask,它依赖的 otherTask1 和 otherTask2 (除其本身有依赖关系外)并不会保证执行的先后顺序与代码顺序一致。这个特征可使多个 task 并行执行提高效率,或是忽略固定的顺序来保证代码的维护性和避免潜在的破坏
终结器 task (finalizer task)
task task1 {
doLast { println 'task1' }
}
task task2 {
doLast { println 'task2' }
}
task1.finalizedBy task2
$ gradle task1
task1
task2
若终结器 task 执行失败,则不会影响 Gradle 的 task 的执行进度
部分命令行选项
-
-?
/-h
/--help
打印帮助信息 -
-b
/--build-file
指定构建文件 e.g.gradle -b my.gradle
-
--offline
使用缓存离线构建 -
-q
/--quiet
,-w
/--warning
,-i
/--info
,-d
/--debug
日志等级 -
s
/--stacktrace
打印简要堆栈跟踪 -
S
/--full-stacktrace
打印所有堆栈跟踪
帮助 task
-
tasks
显示项目可运行的 task,-a
/--all
显示全部 task -
properties
显示项目中可用属性
插件
使用 Java 插件
apply plugin: 'java'
使用 War 插件
apply plugin: 'war'
// 部分自定义属性设置
webAppDirName = 'mywebfiles' // 指定Web应用的源代码路径
war {
// 将 mydir1,mydir2 路径添加到 war 文件的根目录下
from 'mydir1'
from 'mydir2'
}
使用 Jetty 插件
// 在 Gradle 4.0 之前可用
apply plugin: 'jetty'
// 在 Gradle 4.0 之后 jetty 插件已移除,替换为 Gretty
// 其他引用方法见官网:https://gretty-gradle-plugin.github.io/gretty-doc/Getting-started.html
apply from: 'https://raw.github.com/akhikhl/gretty/master/pluginScripts/gretty.plugin'
// Gretty 属性设置
// 详情见官网:https://gretty-gradle-plugin.github.io/gretty-doc/Gretty-configuration.html
gretty {
httpPort = 8081 // 指定服务端口
contextPath = '/MyWebApp' // 指定 url 根路径
// ... many more properties
}
Gretty tasks
-
appRun
/jettyRun
运行程序
属性
version = 0.1 // 设置项目版本
sourceCompatibility = 1.8 // 设置Java编译兼容版本为 1.8
jar {
manifest {
// 添加属性到 Jar 文件中
attributes 'Main-Class': 'path.to.your.MainClass'
}
}
sourceSets {
main {
java {
// 自定义源代码路径,默认是 /src/main/java/
srcDirs = ['your_src_dir_path']
}
}
test {
java {
// 自定义测试代码路径,默认是 /src/test/java
srcDirs = ['your_test_dir_path']
}
}
}
拓展属性
project.ext.myProp = 'hello'
// or
ext.myProp = 'hello'
// or
myProp = 'hello'
或者在 gradle.properties
文件中定义拓展属性
依赖
repositories {
mavenCentral() // 使用 Maven Central 2 仓库
}
// 以下依赖存在多个重复,仅做示例
dependencies {
// 编译使用
compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.9'
// 简写形式,用冒号隔开
compile 'org.apache.commons:commons-lang3:3.9'
// 同 compile ,在 Gradle 5.x 后(建议)用此替换 compile
implementation 'org.apache.commons:commons-lang3:3.9'
// 编译时需要,在运行时由环境提供
providedCompile 'javax.servlet:servlet-api:2.5'
// 运行时提供
runtime 'javax.servlet:jstl:1.1.2'
}
包装器
生成包装器
$ gradle wrapper
# 在构建脚本 build.gradle 旁会生成 gradle/wrapper/... 的包装器文件 *.jar 和 *.properties
# 同时生成 gradlew(for linux),gradlew.bat(for windows)
使用包装器
- Windows:
gradlew.bat ...
- Linux:
gradlew ...
定制包装器
task wrapper(type: Wrapper) {
// 指定 Gradle 版本
gradleVersion = '5.1.1'
// 获取 Gradle 包的 url
distributionUrl = 'http://mycustomserver.com/gradle/dists'
// 包装器被解压后存放的相对路径
distributionPath = 'gradle-dists'
}
笔记部分内容来源:Gradle in Action https://www.manning.com/books...