第一个 Gradle 脚本及简单命令

来源:
三产
最后修订:
2017年03月03日 17:29:16
 686
Gradle 入门

第一个 Gradle 脚本及简单命令

task helloworld {
    doLast {
        print 'Hello world!'
    }
}
/* <<这种方式将在 Gradle5.0 中删除,不建议使用 */
task helloworldSort << {
    print 'Hello world!'
}

task startSession << {
    println 'startSession'
    chant()
}

def chant() {
    /*使用 gradle -q task名称 的方式运行会没有效果
    * 使用 gradle task名称 的方式运行才有效果*/
    ant.echo(message: 'Ant 任务的引用')
    println 'chant'
}

3.times {
    task "yayGradle$it" << {
        println '动态任务的定义' + it
    }
}

/* dependsOn 说明 task 之间的依赖关系,Gradle 会确保被依赖的 task 总会在定义该依赖的 task 之前执行 */
yayGradle0.dependsOn startSession
yayGradle2.dependsOn yayGradle1, yayGradle0
/* 任务执行的顺序 startSession -> yayGradle0 -> yayGradle1 -> yayGradle2 -> groupTherapy */
task groupTherapy(dependsOn: yayGradle2) << {
    println 'groupTherapy'
}

gradle -q task名称 使Gradle只显示对应 task 相关信息

task 代表一个任务 doLast 代表 task 最后执行的一个 action doLast 可以使用 <<更简单的来表达

gradle task --all 查询所有的可以知晓的任务

www.coderknock.com$ gradle task --all
The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
        at build_88ntbwtq2gz525a8g5uy5gmc2.run(D:\Windows\Desktop\LearnGradle\HelloWorld\build.gradle:7)
:tasks

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

构建的 setip 任务,帮助初始化 Gradle 的构建(比如生成 build.gradle 文件)

Build Setup tasks
-----------------
init - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]

帮助任务组,这里列出了任务的名称以及对应描述

Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'HelloWorld'.
components - Displays the components produced by root project 'HelloWorld'. [incubating]
dependencies - Displays all dependencies declared in root project 'HelloWorld'.
dependencyInsight - Displays the insight into a specific dependency in root project 'HelloWorld'.
dependentComponents - Displays the dependent components of components in root project 'HelloWorld'. [incubating]
help - Displays a help message.
model - Displays the configuration model of root project 'HelloWorld'. [incubating]
projects - Displays the sub-projects of root project 'HelloWorld'.
properties - Displays the properties of root project 'HelloWorld'.
tasks - Displays the tasks runnable from root project 'HelloWorld'.

没有分类的任务【目前列出的是我们刚刚声明的任务,自己生命的任务也可以设置任务组】,后期会学习如何添加描述信息

Other tasks
-----------
groupTherapy
helloworld
helloworldSort
startSession
yayGradle0
yayGradle1
yayGradle2

BUILD SUCCESSFUL

Total time: 1.29 secs

每个构建脚本都会默认暴露 Help tasks 任务组,如果某个 task 不属于一个任务组,就会显示在 Other tasks 中。

任务执行

www.coderknock.com$ gradle yayGradle0 groupTherapy
:startSession
startSession
[ant:echo] Ant 任务的引用
chant
:yayGradle0
动态任务的定义task ':yayGradle0'
:yayGradle1
动态任务的定义task ':yayGradle1'
:yayGradle2
动态任务的定义task ':yayGradle2'
:groupTherapy
groupTherapy

BUILD SUCCESSFUL

Total time: 1.61 secs

www.coderknock.com$ gradle groupTherapy
:startSession
startSession
[ant:echo] Ant 任务的引用
chant
:yayGradle0
动态任务的定义task ':yayGradle0'
:yayGradle1
动态任务的定义task ':yayGradle1'
:yayGradle2
动态任务的定义task ':yayGradle2'
:groupTherapy
groupTherapy

BUILD SUCCESSFUL

Total time: 1.614 secs

我们可以看到 gradle yayGradle0 groupTherapygradle groupTherapy两者的运行结果是相同的,这是因为 groupTherapyyayGradle0直接有依赖关系,这样可以保证被依赖的任务只执行一次,并且任务间的执行顺序按照依赖关系进行。

www.coderknock.com$ gradle gT
:startSession
startSession
[ant:echo] Ant 任务的引用
chant
:yayGradle0
动态任务的定义task ':yayGradle0'
:yayGradle1
动态任务的定义task ':yayGradle1'
:yayGradle2
动态任务的定义task ':yayGradle2'
:groupTherapy
groupTherapy

BUILD SUCCESSFUL

Total time: 1.43 secs

Gradle 提供了以驼峰式缩写在命令行上运行命令的方式,我们可以通过如上面一样的gradle gT这样的命令来达到gradle groupTherapy这样的效果。其中要确保任务名字的缩写是唯一的不然会有如下报错效果:

www.coderknock.com$ gradle yG

FAILURE: Build failed with an exception.

* What went wrong:
Task 'yG' is ambiguous in root project 'HelloWorld'. Candidates are: 'yayGradle0', 'yayGradle1', 'yayGradle2'.

* Try:
Run gradle tasks to get a list of available tasks. Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 1.296 secs

我们应该使用yG0来代替yayGradle0

www.coderknock.com$ gradle groupTherapy -x yG0
:yayGradle1
动态任务的定义task ':yayGradle1'
:yayGradle2
动态任务的定义task ':yayGradle2'
:groupTherapy
groupTherapy

BUILD SUCCESSFUL

Total time: 1.378 secs

使用-x参数,我们可以智能排除任务中对应的依赖任务及其相关依赖

使用gradle -h我们可以查询gradle可用参数

www.coderknock.com$ gradle -h

USAGE: gradle [option...] [task...]

-?, -h, --help          显示此帮助消息。Shows this help message.
-a, --no-rebuild        不重新生成项目依赖项。Do not rebuild project dependencies.
-b, --build-file        指定生成文件。Specifies the build file.
-c, --settings-file     指定的设置文件。Specifies the settings file.
--configure-on-demand   只有相关的项目中运行此生成配置。这意味着更快的生成,实现大型多项目生成。[孵化中]Only relevant projects are configured in this build run. This means faster build for large multi-project builds. [incubating]
--console               指定哪种类型的控制台输出生成。值是 '普通'、 '自动' (默认值) 或 '详细'。Specifies which type of console output to generate. Values are 'plain', 'auto' (default) or 'rich'.
--continue              当一个任务执行失败后继续执行任务。Continues task execution after a task failure.
-D, --system-prop       设置系统属性的 JVM (例如 Dmyprop = myvalue)。Set system property of the JVM (e.g. -Dmyprop=myvalue).
-d, --debug             在调试模式下打印日志(包括异常堆栈)。 Log in debug mode (includes normal stacktrace).
--daemon                使用 Gradle 守护进程来进行构建,如果没有运行的守护进程则启动一个。Uses the Gradle Daemon to run the build. Starts the Daemon if not running.
--foreground            在前台启动 Gradle 守护进程。[孵化中]Starts the Gradle Daemon in the foreground. [incubating]
-g, --gradle-user-home  指定 gradle 用户的主目录。Specifies the gradle user home directory.
--gui                   启动 Gradle GUI。Launches the Gradle GUI.
-I, --init-script       指定初始化脚本。Specifies an initialization script.
-i, --info              将日志级别设置为info。Set log level to info.
--include-build         Includes the specified build in the composite. [incubating]
-m, --dry-run           禁用所有任务的操作来进行构建。Runs the builds with all task actions disabled.
--max-workers           配置 Gradle 允许使用的并发的数目。[孵化]Configure the number of concurrent workers Gradle is allowed to use. [incubating]
--no-daemon             不适用守护进程构建。Do not use the Gradle Daemon to run the build.
--no-scan               Disables the creation of a build scan. [incubating]
--offline               构建而不访问网络资源(使用本地缓存)。The build should operate without accessing network resources.
-P, --project-prop      设置项目属性的生成脚本 (例如 Pmyprop = myvalue)。Set project property for the build script (e.g. -Pmyprop=myvalue).
-p, --project-dir       Gradle 指定的起始目录。默认为当前目录。Specifies the start directory for Gradle. Defaults to current directory.
--parallel              并行构建项目。Gradle将尝试测定最佳线程数。Build projects in parallel. Gradle will attempt to determine the optimal number of executor threads to use. [incubating]
--profile               配置构建生成时间,并且在<build_dir>/reports/profile 生成对应的报告。Profiles build execution time and generates a report in the <build_dir>/reports/profile directory.
--project-cache-dir     指定特定于项目的缓存目录。默认值为.gradle 的项目根目录中。Specifies the project-specific cache directory. Defaults to .gradle in the root project directory.
-q, --quiet             Log errors only.
--recompile-scripts     重新编译构建脚本。Force build script recompiling.
--refresh-dependencies  刷新依赖关系的状态。Refresh the state of dependencies.
--rerun-tasks           忽略以前缓存的任务。Ignore previously cached task results.
-S, --full-stacktrace   打印出所有异常堆栈信息(非常详细)。Print out the full (very verbose) stacktrace for all exceptions.
-s, --stacktrace        打印出所有异常堆栈信息。Print out the stacktrace for all exceptions.
--scan                  创建一个构建扫描。如果尚未应用构建扫描插件,Gradle 将失败的生成。[孵化中]Creates a build scan. Gradle will fail the build if the build scan plugin has not been applied. [incubating]
--status                显示运行的和最近停止的守护进程的状态信息。 Gradle Daemon(s)。Shows status of running and recently stopped Gradle Daemon(s).
--stop                  如果有守护进程在运行则停止守护进程。Stops the Gradle Daemon if it is running.
-t, --continuous        允许连续构建。Gradle在构建完成后不退出,并在任务文件变化时重新构建。Enables continuous build. Gradle does not exit and will re-execute tasks when task file inputs change. [incubating]
-u, --no-search-upward  不在父文件夹中搜索 settings.gradle。Don't search in parent folders for a settings.gradle file.
-v, --version           打印版本信息。Print version info.
-x, --exclude-task      指定要排除执行的任务。Specify a task to be excluded from execution.