【Gradle官方文档翻译】起步1:创建Gradle构建

内容

跟随本教程,您将创建出一个简单的Gradle项目、调用一些基础的Gradle命令,并对Gradle如何进行项目管理有初步的了解。

准备工作

  • 大约12分钟的时间

  • 控制台或IDE应用程序

  • Java开发套件(JDK),如果要使用Gradle Groovy DSL需要1.7或更高版本,如果要使用Gradle Kotlin
    DSL则需要1.8或更高版本(仅在运行Gradle时需要)

  • Gradle的发行版,4.10-rc-2以上版本

shell命令行会以类Unix操作系统的样子展示。每条命令在Windows下都有对应的等效命令。

初始化一个项目

首先,我们为项目创建一个目录。

❯ mkdir basic-demo
❯ cd basic-demo

现在,我们可以使用Gradle的 init 命令简单地创建一个项目。我们会探寻所有生成出来的东西从而使您完全明白都发生了些什么。

❯ gradle init ①
Starting a Gradle Daemon (subsequent builds will be faster)

BUILD SUCCESSFUL in 3s
2 actionable tasks: 2 executed

① 如果您想使用Kotlin DSL,那么请使用 gradle init --dsl kotlin。更多详情参考文档

命令行会显示“BUILD SUCCESSFUL”并生成下文所示的“空”项目。如果不是这样,那么请确认Gradle是不是
正确安装了,以及 JAVA_HOME 环境变量是否正确地设置了。

Gradle为你生成了这些东西:

Groovy

├── build.gradle  (1)
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar  (2)
│       └── gradle-wrapper.properties  (3)
├── gradlew  (4)
├── gradlew.bat  (5)
└── settings.gradle  (6)

Kotlin

├── build.gradle.kts  (1)
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar  (2)
│       └── gradle-wrapper.properties  (3)
├── gradlew  (4)
├── gradlew.bat  (5)
└── settings.gradle.kts  (6)
  1. 配置了当前项目任务的项目配置脚本
  2. Gradle包装器可执行JAR包
  3. Gradle包装器配置信息
  4. Gradle包装器在类Unix操作系统下的脚本
  5. Gradle包装器在Windows操作系统下的脚本
  6. 配置构建中参与项目的配置脚本

gradle init 可以生成多种不同类型的项目,甚至知道如何将简单的pom.xml 文件翻译成Gradle支持的方式。

当当当当!我们的教程到这里就可以结束了。但你肯定要知道如何在项目中 使用 Gradle,所以让我们继续吧。

创建一个任务

Gradle提供了通过基于Groovy或Kotlin的DSL创建和配置任务的API。Project 包含了一系列Task,每个任务都会执行一些基础操作。
Gradle附带一个可以用来配置自有项目的任务库。例如叫做 Copy 的一个核心种类,可以将文件从某个位置复制到另一处。Copy任务是非常有用的(参考相关文档获取更多信息),但是现在,再一次,让我们保持简单。执行如下步骤:

  1. 创建名为 src 的目录。
  2. src 文件夹添加名为 myfile.txt 的文件。其内容随意(甚至可以为空),但现在为了方便,就添加一行 Hello, World! 吧。
  3. 在构建文件中定义一个 Copy 类型的 copy 任务(注意大小写),用于将所有 src 目录下的文件复制到一个名为dest 的新文件夹里。(开发者无需自行创建 dest文件夹,任务会自动帮你创建。)

Groovy

task copy(type: Copy, group: "Custom", description: "Copies sources to the dest directory") {
    from "src"
    into "dest"
}

Kotlin

tasks.create<Copy>("copy") {
    description = "Copies sources to the dest directory"
    group = "Custom"

    from("src")
    into("dest")
}

在这里,groupdescription 可以换成任何你需要的。甚至你也可以省略它们,但这样做会导致它们在稍后我们将要使用的tasks 报告中被省略。

现在让我们来执行这个 copy 任务:

❯ ./gradlew copy
> Task :copy

BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed

检查 dest 目录下有没有 myfile.txt 文件,并验证内容是否一致。

使用插件

Gradle包含一大堆插件,而且还有很多很多插件在Gradle插件门户提供。跟随发行版提供的插件之一是base 插件。结合 Zip核心类型,开发者就可以配置名称、位置来给项目打zip包了。

使用 plugins 语法来给你的构建文件添加 base 插件。确保要在文件头部添加 plugins {} 代码块。

Gradle

plugins {
    id "base"
}

... 构建文件的其他部分 ...

Kotlin

plugins {
    id("base")
}

... 构建文件的其他部分 ...

现在,添加将 src 目录打成zip包的任务:

Gradle

task zip(type: Zip, group: "Archive", description: "Archives sources in a zip file") {
    from "src"
    setArchiveName "basic-demo-1.0.zip"
}

Kotlin

tasks.create<Zip>("zip") {
    description = "Archives sources in a zip file")
    group = "Archive"

    from("src")
    setArchiveName("basic-demo-1.0.zip")
}

base 插件和设置协同工作,可以在 build/distributions 文件夹下创建打包后的文件basic-demo-1.0.zip

现在,简单地运行新添加的 zip任务,就能在对应位置看到生成的zip文件了。

❯ ./gradlew zip
> Task :zip
    
BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed

构建的浏览或调试

让我们来看看Gradle在我们的新项目中还能做些什么。我们也提供了完整的命令行接口参考手册

发掘可用的任务

tasks 命令会列出所有可用的Gradle任务,包括通过 base 插件引入的任务和我们刚刚添加的那些自定义任务。

❯ ./gradlew tasks

> Task :tasks

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

Archive tasks
-------------
zip - Archives sources in a zip file

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
clean - Deletes the build directory.

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

Custom tasks
------------
copy - Simply copies sources to a the build directory

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

Verification tasks
------------------
check - Runs all checks.

Rules
-----
Pattern: clean<TaskName>: Cleans the output files of a task.
Pattern: build<ConfigurationName>: Assembles the artifacts of a configuration.
Pattern: upload<ConfigurationName>: Assembles and uploads the artifacts belonging to a configuration.

To see all tasks and more detail, run gradlew tasks --all

To see more detail about a task, run gradlew help --task <task>

BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed

构建的分析和调试

Gradle同时也提供了一个丰富的、基于web的页面用于展示你的构建,其名为构建扫描

构建扫描的基础Demo

通过使用 --scan参数或明确地在项目中启用构建扫描插件,你可以在scans.gradle.com免费地创建一个构建扫描。将构建扫描发布到scans.gradle.com会将这些数据发送至Gradle服务器。要想使数据停留在您自己的服务器上,请考虑Gradle企业版

尝试在执行一个任务的时候加入 --scan 选项。

❯ ./gradlew zip --scan

BUILD SUCCESSFUL in 0s
1 actionable task: 1 up-to-date

Publishing a build scan to scans.gradle.com requires accepting the Terms of Service defined at https://scans.gradle.com/terms-of-service. Do you accept these terms? [yes, no]
Gradle Cloud Services license agreement accepted.

Publishing build scan...
https://gradle.com/s/repnge6srr5qs

通过浏览构建扫描结果,你可以轻松地看到那些任务被执行了、每个任务执行的耗时、使用了哪些插件等等。当下次你在StackOverflow上调试什么东西的时候,考虑分享一下构建扫描。

构建扫描插件用户手册上可以学到更多关于构建扫描插件的配置和使用信息。

列举可用属性

properties 命令会告诉你项目的参数。

❯ ./gradlew properties

输出结果非常长。下面是可用属性的一部分:

> Task :properties

------------------------------------------------------------
Root project
------------------------------------------------------------

buildDir: /Users/.../basic-demo/build
buildFile: /Users/.../basic-demo/build.gradle.kts
description: null
group:
name: basic-demo
projectDir: /Users/.../basic-demo
version: unspecified

BUILD SUCCESSFUL

项目的 name 默认和所在文件夹的名称是一致的。你也可以给 groupversion 属性指定值,但现在它们和
description 一样是使用的默认值。

buildFile 属性是构建脚本的全名限定路径,默认位于 projectDir 下。

一些属性是可以被修改的。例如在构建脚本文件中尝试加入如下代码行,然后重新执行 gradle properties

description = "A trivial Gradle build"
version = "1.0"

接下来的步骤

恭喜!你已经学会如何创建一个新的Gradle构建并检验它!
你肯定希望创建针对特定平台的库或应用,所以这里给出一些教程,它们会知道你如何在选定的平台上进行构建:

同时你也可以签出一些GitHub上的Gradle构建示例

帮忙改进本教程

寻求反馈或具有疑问?发现拼写错误?和所有的Gradle教程一样,帮助就是一个GitHub的issue。请在gradle-guides/creating-new-gradle-builds添加issue或拉取请求,我们会给您帮助。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,490评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,678评论 6 342
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,042评论 25 707
  • 举个栗子:内存溢出的bug是我们经常会碰到的棘手问题,这个问题发生之后,不同级别的程序员反应如何呢? 初级程序员的...
    FlynnHai阅读 196评论 0 0
  • 在天津的同学说自己的同事“十一”想到青岛看看,让给推荐一些景点。 这些年,在这座城市的大街小巷、山川海洋穿梭往返,...
    不辣的妈阅读 659评论 6 7