毫无疑问,现在Gradle已经成为java世界最火的构建工具,风头已经盖过了冗余的ant,落后的maven。Gradle是以Groovy语言编写的一套构建脚本的DSL,由于Groovy语法的优雅,所以导致Gradle天生就有简洁、可读性强、灵活等特性。

Gradle的命令行功能也非常强大。本人从maven转到Gradle,深深被gradle强大的命令行功能折服。通过命令行来实现Gradle的各种特性,就像魔法师在表演魔法一样。

  • 日志输出。 Gradle中的日期有6个层级。从高到低分别是 ERROR(错误信息)、QUIET(重要信息)、WARNGING(警告信息)、LIFECYCLE(进程信息)、INFO(一般信息)、DEBUG(调试信息)。在执行gradle task时可以适时的调整信息输出等级,以便更方便的观看执行结果。

    比如一个build.gradle有这样一个task

1
2
3
task hello << {
println 'hello world!'
}

加入-q与不加-q的输出结果不同。

1
2
3
4
5
6
7
8
9
$ gradle hello
:hello
hello world! BUILD SUCCESSFUL Total time: 3.546 secs
$ gradle -q hello
hello world!
  • 堆栈跟踪。如果执行gradle task失败时,如果想得到更详细的错误信息,那么就可以使用-s(或--stacktrace)来输出详细的错误堆栈。你还可以使用-S(或--full-stacktrace)来输出全部堆栈信息,不过一般不推荐这样做,因为gradle是基于groovy语言,而groovy作为一门动态语言可能会输出与你的错误代码毫不相关的信息。

  • 跳过指定的测试。如果你在执行build的时候想跳过test task,那么可以使用-x命令。

1
2
3
4
5
6
7
8
9
10
11
12
$ gradle build -x test
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar UP-TO-DATE
:assemble UP-TO-DATE
:check
:build BUILD SUCCESSFUL Total time: 3.529 secs
  • 继续执行task而忽略前面失败的task。默认情况下,如果有某个task失败,后续的task就不会继续执行。但是有时候我们想运行所有的task来一次性得到所有的构建错误,那么我们可以使用--continue命令。使用--continue命令后即使遇到某些task失败也不会停止后续task的执行。但是需要注意的是如果某个task失败了,那么依赖于这个task的其他task依旧不会执行,因为这会带来不安全的因素。

  • 调用task时使用短名或缩写。如果一个task的名称过程,那么调用时可以只输入部分名称即可调用,无需输入全名。

1
2
3
task helloWorld << {
println 'hello world!'
}

比如调用helloWorld可以通过全名调用、前缀调用或首字母调用。

1
2
3
4
5
6
$ gradle -q helloWorld
hello world!
$ gradle -q hell
hello world!
$ gradle -q hW
hello world!
  • 使用指定的gradle文件调用task。默认情况下,如果你调用gradle task,那么首先会寻找当前目录下的build.gradle文件,以及根据settings.gradle中的配置寻找子项目的build.gradle。但是有时候我们想指定使用某个gradle文件,那么可以使用-b命令。
    比如当前目录有个子目录subproject1,里面有个叫hello.gradle。
subproject1/hello.gradle
1
2
3
task helloWorld << {
println 'hello world!'
}

那么在当前目录可以使用以下命令调用这个task。

1
2
3
4
5
6
7
$ gradle -b subproject1/hello.gradle  helloWorld
:helloWorld
hello world! BUILD SUCCESSFUL Total time: 3.752 secs
  • 使用指定的项目目录调用task。前面已经说过,执行gradle的task默认会在当前目录寻找build.gradle及settings.gradle文件。如果我们想在任何地方执行某个项目的task,那么可以使用-p来指定使用的项目。
1
gradle -q -b learnGradle helloWorld

这条命令是调用learnGradle这个项目下的helloWorld task。

  • 显示task之间的依赖关系。众所周知,使用gradle tasks可以列出当前所有可被使用的task,但是并没有显示task之间的依赖关系。我们可以加上--all来显示
    task的依赖关系。
1
2
3
4
5
6
7
8
9
10
11
$ gradle tasks --all
……………… Other tasks
-----------
task0
task1
task2
task3 …………
从上面可以看出task0依赖task1、task2及task3。
  • 查看指定阶段的依赖关系。使用gradle dependencies 可以查看项目中包的依赖关系。不过是列出了所有阶段的依赖,如果项目中依赖复杂的话看起来有点头痛。那么可以使用--configuration来查看指定阶段的依赖情况。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ gradle -q dependencies

------------------------------------------------------------
Root project
------------------------------------------------------------ archives - Configuration for archive artifacts.
No dependencies compile - Compile classpath for source set 'main'.
No dependencies default - Configuration for default artifacts.
No dependencies runtime - Runtime classpath for source set 'main'.
No dependencies testCompile - Compile classpath for source set 'test'.
\--- junit:junit:4.11
\--- org.hamcrest:hamcrest-core:1.3 testRuntime - Runtime classpath for source set 'test'.
\--- junit:junit:4.11
\--- org.hamcrest:hamcrest-core:1.3

使用gradle -q dependencies --configuration testCompile可以只查看testComiple的依赖。

1
2
3
4
5
6
7
8
9
$ gradle -q dependencies --configuration testCompile

------------------------------------------------------------
Root project
------------------------------------------------------------ testCompile - Compile classpath for source set 'test'.
\--- junit:junit:4.11
\--- org.hamcrest:hamcrest-core:1.3
  • 查看指定dependency的依赖情况。
    假如我想查看项目中有没有引入junit,那些阶段引入了junit,那么可以使用dependecyInsight来查看。
1
2
3
4
$ gradle dependencyInsight --dependency junit --configuration testCompile
:dependencyInsight
junit:junit:4.11
\--- testCompile

注意dependencyInsight默认只会查看compile阶段的依赖,如果要查看其他阶段可以使用--configuration来指定。

  • 使用--profile命令行可以产生build运行时间的报告。该报告存储在build/report/profile目录,名称为build运行的时间。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ gradle build --profile
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar UP-TO-DATE
:assemble UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build UP-TO-DATE BUILD SUCCESSFUL Total time: 3.726 secs

然后在build/report/profile目录下可以看到build的report。

这个报表非常有用,尤其是在在缩短build时间时可以快速定位那些耗时长的task。

  • 试运行build。如果你想知道某个task执行时那些task会被一起执行,但是你又不想真正的执行这些task,可以使用-m来试运行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ gradle -m build
:compileJava SKIPPED
:processResources SKIPPED
:classes SKIPPED
:jar SKIPPED
:assemble SKIPPED
:compileTestJava SKIPPED
:processTestResources SKIPPED
:testClasses SKIPPED
:test SKIPPED
:check SKIPPED
:build SKIPPED BUILD SUCCESSFUL Total time: 3.53 secs

这样我们可以一目了然的看到那些task被执行了,又不需要花太多的时间。

  • Gradle的图形界面。

其实Gradle自带一个图形界面来让习惯gui操作的人来操作Gradle。打开方式很简单。

1
$ gradle --gui

这样就会弹出一个gui界面。

通过这个gui界面可以很方面的执行gradle的各种命令,还可以将常用的命令保存为favorites。该gui的配置信息默认被存储在当前项目的gradle-app.setting文件中。

注意使用gradle --gui会阻塞当前终端,可以使用gradle --gui&来实现后台运行。

  • 重新编译Gradle脚本。第一次运行Gradle命令,会在项目更目录下生成一个.gradle目录来存放编译后的脚本。只有当构建脚本发生修改时采用重新编译。我们可以使用--recompile-scripts来强行重新编译。

Gradle命令行黑魔法的更多相关文章

  1. 用Gradle命令行编译Android工程

    在Android sdk 目录下的samples/android-21/ 文件夹下,任找一个工程,如果在命令行直接编译 可能会报这种错误:gradle buile.gradle FAILURE: Bu ...

  2. 【转载】Gradle学习 第十一章:使用Gradle命令行

    转载地址:http://ask.android-studio.org/?/article/94 This chapter introduces the basics of the Gradle com ...

  3. Chapter 4. Using the Gradle Command-Line 使用gradle命令行

    This chapter introduces the basics of the Gradle command-line. You run a build using the gradle comm ...

  4. Gradle命令行操作

    任务排除 gradle task1 -x task2 task2就是被排除的任务,同时task2依赖的任务也会被排除掉 守护进行执行 默认情况下,每次构建,都要启动一次JVM, gradle -dae ...

  5. [Gradle] 获取 gradle 命令行参数

    project.gradle.startParameter 参考 StartParameter | Gradle API 4.9

  6. gradle 命令行

    1. 帮助 ./gradlew -h 2. gradle 可执行tasks gradle tasks or ./gradlew tasks 3. gradle help 任务 帮助了解每个task 的 ...

  7. gradle命令行打包不同环境的apk包

    为什么我搜这个? 因为 早上在开发那边我看到他控制不同环境就是在这个下拉框选择不同的环境的 搜索词: Gradle 入门--只此一篇 https://www.jianshu.com/p/001abe1 ...

  8. Gradle之恋-命令行详解

    虽然很多童鞋都必须要用IDE,但有些命令是IDE很难表现出来的,还是命令行返璞归真.本文就带你来剖析Gradle的命令行. 本文不包括试验性(incubating)的选项,如--configure-o ...

  9. [编译] 7、在Linux下搭建安卓APP的开发烧写环境(makefile版-gradle版)—— 在Linux上用命令行+VIM开发安卓APP

    April 18, 2020 6:54 AM - BEAUTIFULZZZZ 目录 0 前言 1 gradle 安装配置 1.1 卸载系统默认装的gradle 1.2 下载对应版本的二进制文件 1.3 ...

随机推荐

  1. nginx环境下配置nagiosQL-关于nagiosql配置文件

    接上文:nginx环境下配置nagios-关于nginx.conf nagiosql文件应该处于conf/domain/目录下 nagiosql配置如下: ;                  gzi ...

  2. ORA-01720: grant option does not exist for 'xxx.xxxx' (ORA-01720 ‘XXX’ 不存在授权选项)

    原因:用户A将表tab的SELECT权限授予了用户B,而用户B将视图v_tab的查询权限授予C时,也试图将表tab授予用户C,但用户B并没有这个权限(将表tab授予用户C),而引起的 用户B没有授权选 ...

  3. Spring----->projects----->Spring Web Flow

    1.概述(about Spring Web Folw) Spring Web Flow是spring社区一个子project Spring Web Flow builds on Spring MVC ...

  4. POJ 2155 Matrix (二维树状数组)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17224   Accepted: 6460 Descripti ...

  5. frame和bounds的区别与联系

    首先先看一下下面两个属性的代码实现: -(CGRect)frame{ return CGRectMake(self.frame.origin.x,self.frame.origin.y,self.fr ...

  6. PostGreSQL 分页

    select * from users limit 10 offset 20; limit A offset B    其中A是页容量 B是偏移量 即跳过前20条 查询每页10条

  7. 如何正确接收 GitHub 的消息邮件

    背景 我厂的开发流程通常都是基于 GitHub 的.在 GitHub 上 review 代码,也是我日常工作的重要组成部分.对我来说,在 code review 过程中最讨厌的莫过于,我在 pull ...

  8. SILVERLIGHT 多维表头、复杂表头 MULTIPLE HEADER

    先上图, 众所周知,利用silverlight datagrid展示数据相当方便,但是想要弄出一个漂亮的表头却要费尽周折.此文的目的就是简要介绍一下利用第三方控件 C1.Silverlight.Fle ...

  9. NSArray其中的方法--遍历,

    1. ForLoop, For - in, enumerateObjects这个三个方法的区别: 遍历一个数组用For-in最快. 通过Value查询index的时候, 面对大量的数组推荐使用 enu ...

  10. 1334: [Baltic2008]Elect

    Description N个政党要组成一个联合内阁,每个党都有自己的席位数. 现在希望你找出一种方案,你选中的党的席位数要大于总数的一半,并且联合内阁的席位数越多越好. 对于一个联合内阁,如果某个政党 ...