我的Gradle折腾经历-Part2

316 阅读4分钟

编辑历史

2023-08-01 14:42 23:12,为了控制文章阅读长度(为了获得今日份掘友分)因此拆分为两部分,这部分会记录一下我对Gradle的构建脚本文件build.gradle的折腾经历,包括折腾的一些插件,构建配置,依赖项等。

我是一个 Gradle Java Spring Boot 项目

项目的根目录指的是与 build.gradle 文件同级的目录

参考资料

docs.gradle.org/8.2.1/dsl/

docs.gradle.org/current/use…

gradle.org/guides/#get…

Gradle 相关概念简介

Gradle丰富的API 、成熟的插件和集成生态 可以帮助我们实现自动化。在深入了解Gradle的细节之前了解一些与Gradle有关的概念对我们来说是有帮助的。

项目[Projects]是Gradle构建的对象,可以被打包为 JarWar 甚至是 zip 文件。位于项目根目录中的build.gradle构建脚本文件为项目定义了任务、依赖项、插件和其他配置。

任务[Tasks]是单独的一小份工作。Tasks定义了执行工作的一些逻辑,如编译代码、运行测试和部署代码。插件[Plugins]可以提供更多类型的任务。

插件[Plugins]允许在任务、文件和依赖项配置之外的构建中引入新概念。在Gradle中有两种类型的插件:scriptbinary

构建[Builds]是 Gradle 项目中任务集合的执行。在Gradle中构建

'plugins' 无法应用于 '(groovy.lang.Closure)'

我遇到过在构建脚本build.gradle中出现 plugins 无法应用于 (groovy.lang.Closure) 的提醒(这应该不算错误吧,程序可以正常运行),这可能是因为使用了旧版本的 Gradle。然后,我没有搞定~

在较旧的 Gradle 版本中,使用 plugins 块时需要在 buildscript 块内部进行声明。

请参考以下示例来正确配置 buildscriptplugins 块:

buildscript {
    
    repositories {
        // 定义你的仓库
        mavenCentral()
    }
    
    dependencies {
        // 定义你的依赖项
        classpath 'org.springframework.boot:spring-boot-gradle-plugin:x.x.x'
    }
}

plugins {
    id 'org.springframework.boot' version 'x.x.x'
}

// 其他配置

将 x.x.x 替换为实际的 Spring Boot 版本号。

另一种姿势

升级 Gradle 版本到更高的版本。将Windows计算机上的Gradle版本升级到了 Gradle 8.2.1

gradle -v 查看最新版本

------------------------------------------------------------
        Gradle 8.2.1
------------------------------------------------------------
Build time:   2023-07-10 12:12:35 UTC
Revision:     a38ec64d3c4612da9083cc506a1ccb212afeecaa
Kotlin:       1.8.20
Groovy:       3.0.17
Ant:          Apache Ant(TM) version 1.10.13 compiled on January 4 2023
JVM:          1.8.0_333 (Oracle Corporation 25.333-b02)
OS:           Windows 10 10.0 amd64

IDEA 构建 Gradle

使用来自此位置的Gradle

1、gradle-wrapper.properties

2、Gradle构建脚本中的Wrapper任务

3、指定位置

在构建脚本build.gradle中添加自定义任务

Gradle的构建脚本只不过是Groovy语句:

入门

task hello {
    doLast {
        println 'hello world'
    }
}

通过 gradlew 脚本使用Gradle Wrapper 运行: ./gradlew hello

> Task :hello
hello world

BUILD SUCCESSFUL in 869ms
1 actionable task: 1 executed

任务间依赖

我们可以定义依赖于其他任务的任务。可以通过在任务定义中传递 dependOn: taskName 参数来定义任务依赖关系:

task libtask {
    doLast {
        println 'lib is using!'
    }
}

task servicetask(dependsOn: libtask) {
    doLast {
        println "service working"
    }
}

./gradlew servicetask

> Task :libtask
lib is using!

> Task :servicetask
service working

BUILD SUCCESSFUL in 845ms
2 actionable tasks: 2 executed

任务属性

task ourTask {
    ext.propertyName = "value"
}

Gradle 插件

Gradle 插件是一组功能的集合,可以扩展 Gradle 构建系统的能力。插件可以用于执行各种构建任务、管理依赖关系、生成文档等。Gradle 提供了许多常用的插件,如 Java 插件、Android 插件、Spring Boot 插件等,也可以自定义开发插件来满足特定需求。

在 Gradle 2.1 版本之前,应用插件有两种声明方式:传统插件声明方式(Legacy Plugin Application)和新插件声明方式(New Plugin Application)。

Gradle 2.1 版本之后引入了插件 ID 的概念。插件 ID 是唯一标识一个 Gradle 插件的字符串,通常以 id 'plugin-id' 的形式出现。每个插件都有一个特定的 ID,例如 java 插件的 ID 是 java,android 插件的 ID 是 com.android.application

传统的插件声明方式不再被推荐使用,新的插件声明方式更加简洁和灵活,并且提供了更好的可维护性和可扩展性。

新的插件声明方式

以之前生成的build.gradle文件中的插件声明内容为例,新的插件声明方式使用 plugins{} 块来声明插件

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.7.14'
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

使用 Plugins DSL 应用 Binary Plugins

Plugins DSL 具有一些限制:

1、在 plugins{} 块中不支持Groovy代码

2、plugins{} 块必须在 build.gradle 构建脚本的最顶端(在它之前只允许 buildscripts{} 块)

3、Plugins DSL 不能用脚本插件、settings.gradle 文件或初始化脚本编写

Plugins DSL 依然在改进中,随着版本的不断迭代可能会有一些变化。

传统的插件声明方式

传统的插件声明方式是通过 apply plugin 语句 在 build.gradle 构建脚本中声明要应用的插件。语法为 apply plugin: 'plugin-id',其中 plugin-id是要应用的插件的唯一标识。

需要确保构建脚本中已经配置了所需插件的依赖项。通常,插件的依赖项可以通过 buildscript{} 块中的 dependencies 部分进行配置。

buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath "org.shipkit:shipkit:2.3.5"
    }
}

apply plugin: "org.shipkit.bintray-release"

依赖管理

待补充~

多项目的构建

待补充~