当前位置:首页 > 科技  > 软件

推荐 9 个 Gradle 优秀实践,进阶必备!

来源: 责编: 时间:2023-10-08 07:05:10 341观看
导读1.使用 Gradle 包装器包装器是项目中包含的特殊脚本,用于下载正确的 Gradle 版本并执行构建。使用包装器有 3 大优点:不需要在本地安装 Gradle 来进行构建可以始终使用项目支持的 Gradle 版本。更新Gradle版本很容易如

1.使用 Gradle 包装器

包装器是项目中包含的特殊脚本,用于下载正确的 Gradle 版本并执行构建。tBd28资讯网——每日最新资讯28at.com

使用包装器有 3 大优点:tBd28资讯网——每日最新资讯28at.com

  1. 不需要在本地安装 Gradle 来进行构建
  2. 可以始终使用项目支持的 Gradle 版本。
  3. 更新Gradle版本很容易

如果你的项目中当前没有包装器,在 Linux 中可以通过运行 ./gradlew <task-name> 来添加,在Windows 中使用 gradlew.bat <task-name>,那么就不会出错。tBd28资讯网——每日最新资讯28at.com

2.停止清理项目

如果你每次构建时都执行清理,那么会造成极大的时间浪费,如下:tBd28资讯网——每日最新资讯28at.com

./gradlew clean build

Gradle 有一个很的强功能,称为增量构建,意味着如果更改项目中的某些内容并运行构建,它只会根据该更改运行必要的任务。例如,如果只修改测试类,Gradle 不需要重新编译生产代码。增量构建意味着微小的更改构建速度会非常快,从而帮助开发人员完成更多工作。tBd28资讯网——每日最新资讯28at.com

3.添加settings.gradle

settings.gradle文件通常位于项目的根目录中,用于指定项目名称以及要添加到构建中的子项目。tBd28资讯网——每日最新资讯28at.com

示例:tBd28资讯网——每日最新资讯28at.com

rootProject.name = 'settings-example'include 'some-subproject'

不过,settings.gradle是可选的。tBd28资讯网——每日最新资讯28at.com

如果缺省该文件,Gradle 将会使用基于目录名称的项目名称,如果项目被克隆到不同名称的目录,则其项目名称将不正确。例如,这可能发生在 CI 服务器上。tBd28资讯网——每日最新资讯28at.com

还有性能影响。如果省略settings.gradle,Gradle 会递归地在目录树中向上导航以查找此类文件。这可能会产生大量不必要的文件读取。tBd28资讯网——每日最新资讯28at.com

4. 将任务移至buildSrc

buildSrc目录位于项目的根目录中,可以包含 Groovy、Kotlin 或 Java 源代码。如果build.gradle中有一些任务代码,则可以转移到buildSrc,原因有 3 个:tBd28资讯网——每日最新资讯28at.com

  • 清理build.gradle,使其更容易理解
  • 将任务实现与声明分开
  • 对于多项目构建,任务可以在其他子项目中使用

例如下面这个不太友好的 build.gradle 示例:tBd28资讯网——每日最新资讯28at.com

abstract class RollercoasterTask extends DefaultTask {    @Input    abstract Property<String> getFavouriteCoaster()    RollercoasterTask() {        favouriteCoaster.convention('Space mountain')    }    @TaskAction    def tellMeMyFavourite() {        println "Your favourite coaster is ${favouriteCoaster.get()}!"    }}tasks.register('coaster', RollercoasterTask) {    favouriteCoaster = 'Super-duper loopy coaster'}

随着build.gradle 的增长,这种代码会让你头晕目眩。解决办法就是在与build.gradle相同的级别创建buildSrc目录,结构如下:tBd28资讯网——每日最新资讯28at.com

├── build.gradle├── buildSrc│   └── src│       └── main│           └── groovy│               └── com│                   └── tomgregory│                       └── RollercoasterTask.groovy

可以将类定义从build.gradle转移到RollercoasterTask.groovy中。只需包含相关的package和import 即可。如下:tBd28资讯网——每日最新资讯28at.com

package com.tomgregoryimport org.gradle.api.DefaultTaskimport org.gradle.api.provider.Propertyimport org.gradle.api.tasks.Inputimport org.gradle.api.tasks.TaskActionabstract class RollercoasterTask extends DefaultTask {    @Input    abstract Property<String> getFavouriteCoaster()    RollercoasterTask() {        favouriteCoaster.convention('Space mountain')    }    @TaskAction    def tellMeMyFavourite() {        println "Your favourite coaster is ${favouriteCoaster.get()}!"    }}

在build.gradle中,可以用单个 import 语句替换类定义。tBd28资讯网——每日最新资讯28at.com

import com.tomgregory.RollercoasterTasktasks.register('coaster', RollercoasterTask) {    favouriteCoaster = 'Super-duper loopy coaster'}

这样就清晰多了。tBd28资讯网——每日最新资讯28at.com

5. 并行运行测试

可以充分利用可用的 CPU 内核来并行运行测试,build.gradle 添加如下配置:tBd28资讯网——每日最新资讯28at.com

test {    maxParallelForks 3}

完成此操作后,Gradle 将会并行执行测试。这里配置了3个执行器,可根据实际配置此参数。tBd28资讯网——每日最新资讯28at.com

6. 项目进行版本化

对 Gradle 项目进行版本控制可以让你更轻松地了解何时引入了更改。当其他人使用你的项目时,这一点尤其重要。tBd28资讯网——每日最新资讯28at.com

例如,Gradle 本身使用相当标准的版本号系统,其中包括主版本、次版本和补丁版本。tBd28资讯网——每日最新资讯28at.com

tBd28资讯网——每日最新资讯28at.com

这样做的好处是 Gradle 用户,在升级 Gradle 时可以轻松了解更改的范围。当主要版本增加时,这表明可能会有重大更改,我们应该阅读发行说明。tBd28资讯网——每日最新资讯28at.com

在 Gradle 中,设置版本号是在build.gradle中完成的,如下所示:tBd28资讯网——每日最新资讯28at.com

version = '0.1.0'

7. 将任务声明封装在插件中

任务声明是创建某个任务类的实例时,通常配置一些任务属性。tBd28资讯网——每日最新资讯28at.com

如下创建了一个名为copyQuote的 Copy 任务:tBd28资讯网——每日最新资讯28at.com

project.tasks.register('copyQuote', Copy) {    from 'quote.txt'    into "$project.buildDir/quotes"    filter(ReplaceTokens, tokens: [CHARACTER: 'Tweedledee'])}

事实上,在build.gradle中声明此任务可能会导致几个问题:tBd28资讯网——每日最新资讯28at.com

  • 额外的代码使得从高层次理解build.gradle变得更加困难
  • 如果在不同的子项目中声明类似的任务,可能会出现重复

解决方案是将逻辑移至插件中,如果只需要在自己的项目(而不是其他项目)中使用该插件,则可以在buildSrc目录中定义它。tBd28资讯网——每日最新资讯28at.com

.├── build.gradle├── buildSrc│   └── src│       └── main│           ├── groovy│           │   └── com│           │       └── tomgregory│           │           ├── WonderlandPlugin.groovy

将copyQuote任务移动到插件类中,代码如下:tBd28资讯网——每日最新资讯28at.com

package com.tomgregoryimport org.apache.tools.ant.filters.ReplaceTokensimport org.gradle.api.Pluginimport org.gradle.api.Projectimport org.gradle.api.tasks.Copyclass WonderlandPlugin implements Plugin<Project> {    void apply(Project project) {        def extension = project.extensions.create('wonderland', WonderlandPluginExtension)        project.tasks.register('copyQuote', Copy) {            from 'quote.txt'            into "$project.buildDir/quotes"            filter(ReplaceTokens, tokens: [CHARACTER: extension.characterName.get()])        }    }}

现在build.gradle可以大大简化。tBd28资讯网——每日最新资讯28at.com

plugins {    id 'wonderland'}wonderland {    characterName = 'Tweedledee'}

8. 优化存储库

在build.gradle中声明存储库告诉 Gradle 应该在哪里查找构建应用程序所需的依赖项。tBd28资讯网——每日最新资讯28at.com

例如,在这里我们告诉 Gradle 查看我的自定义本地 Maven 存储库和 Maven Central。tBd28资讯网——每日最新资讯28at.com

repositories {    maven {        name = 'tomRepo'        url 'http://localhost:8081/repository/snapshots'        allowInsecureProtocol true        credentials(PasswordCredentials)    }    mavenCentral()}

假设同一个项目需要这些依赖项来构建 Java 应用程序。tBd28资讯网——每日最新资讯28at.com

dependencies {    implementation group: 'com.tom', name: 'artifact-to-publish', version: '1.0-SNAPSHOT'    implementation 'commons-lang:commons-lang:2.6'    implementation 'com.google.guava:guava:30.1.1-jre'    implementation 'org.mapstruct:mapstruct:1.4.2.Final'    implementation 'org.hibernate:hibernate-validator:7.0.1.Final'}

第一个依赖项来自本地 Maven 存储库,但其他依赖项可在 Maven Central 中找到。tBd28资讯网——每日最新资讯28at.com

9. 切勿提交密码

你是否曾经将密码提交到版本控制中然后遭受领导的鄙夷,或者被安全公司审查出安全问题。接下来我们将介绍如何避免。tBd28资讯网——每日最新资讯28at.com

不过,这已经成为过去,因为 Gradle 提供了许多我们可以将凭证移出项目的方法。tBd28资讯网——每日最新资讯28at.com

示例:tBd28资讯网——每日最新资讯28at.com

repositories {    maven {        name = 'tomsRepo'        url 'https://xxx.com/maven/demo/'        credentials(PasswordCredentials)    }}

那么 Gradle 将自动查找属性<repositoryName>Username和<repositoryName>Password.tBd28资讯网——每日最新资讯28at.com

你可以在命令行上传递这些参数或在~/.gradle/gradle.properties中设置,如下:tBd28资讯网——每日最新资讯28at.com

// gradle.properties 中配置tomsRepoUsername=myusernametomsRepoPassword=mypassword

另一种方法是直接访问 Gradle 属性:tBd28资讯网——每日最新资讯28at.com

repositories {    maven {        url 'https://xxx.com/maven/demo/'        credentials {            username 'toms'            password property('mypw')        }    }}

在命令行或~/.gradle/gradle.properties中传递密码。tBd28资讯网——每日最新资讯28at.com

命令行示例:tBd28资讯网——每日最新资讯28at.com

./gradlew build --refresh-dependencies -Pmypw=<password>


~/.gradle/gradle.properties示例:
tBd28资讯网——每日最新资讯28at.com

mypw=mypassword


tBd28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-12296-0.html推荐 9 个 Gradle 优秀实践,进阶必备!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 分享30个避免低级Bug的代码技巧清单!

下一篇: 12字真言,教你如何选择Gradle和Maven

标签:
  • 热门焦点
  • Redmi Buds 4开箱简评:才199还有降噪 可以无脑入

    在上个月举办的Redmi Note11T Pro系列新机发布会上,除了两款手机新品之外,Redmi还带来了两款TWS真无线蓝牙耳机产品,Redmi Buds 4和Redmi Buds 4 Pro,此前我们在Redmi Note11T
  • JavaScript 混淆及反混淆代码工具

    介绍在我们开始学习反混淆之前,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。什么是混
  • 一年经验在二线城市面试后端的经验分享

    忠告这篇文章只适合2年内工作经验、甚至没有工作经验的朋友阅读。如果你是2年以上工作经验,请果断划走,对你没啥帮助~主人公这篇文章内容来自 「升职加薪」星球星友 的投稿,坐
  • 学习JavaScript的10个理由...

    作者 | Simplilearn编译 | 王瑞平当你决心学习一门语言的时候,很难选择到底应该学习哪一门,常用的语言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein&ldquo;利用市场支配力量强迫服装厂商与之签订独家
  • 华为发布HarmonyOS 4:更好玩、更流畅、更安全

    在8月4日的华为开发者大会2023(HDC.Together)大会上,HarmonyOS 4正式发布。自2019年发布以来,HarmonyOS一直以用户为中心,经历四年多的发展HarmonyOS已
  • iQOO 11S屏幕细节公布:首发三星2K E6全感屏 安卓最好的直屏手机

    日前iQOO手机官方宣布,新一代电竞旗舰iQOO 11S将会在7月4日19:00正式与大家见面。随着发布时间的日益临近,官方关于该机的预热也更加密集,截至目前已
  • 到手价3099元起!iQOO Neo8 Pro今日首销:安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
Top