Gradle Kotlin 规范插件用于模块化结构 - 共享构建逻辑

news2025/2/25 6:44:48

Gradle Kotlin 规范插件用于模块化结构 - 共享构建逻辑

gradle logo
我们中的许多人都遇到过Groovy的困难,并习惯于将其转换为Kotlin DSL。 然后,作为Android工程师,在完全使用Kotlin编写的项目上工作是纯粹的喜悦。

我们假设采用基于功能的模块化应用程序结构,并应用版本目录(version catalog)功能。我们将充分管理构建逻辑,使其集中化并可由模块重用。
以下是通过创建您的自定义插件脚本来促进Gradle构建配置成为集中化构建逻辑的步骤。

我们所有人都通常采用的方法是将自定义脚本放置到默认的buildSrc模块中。先前不推荐使用buildSrc实现,因为它会使构建缓存失效,并在每次更改依赖项时同步整个项目。它现在被视为Gradle 8中的一个包含式构建。

项目级声明

在项目设置脚本中,我们将配置脚本移动到一个构建逻辑复合构建模块中。
第一个 pluginManagement 块确保 Gradle 使用适当的插件存储库。我们将我们的新模块包含在构建中,并明确指定我们需要的存储库。
另一个关键元素是集中式依赖声明中的解析模式,你可以声明以强制 Gradle 始终获取正确的依赖项。在此示例中,我们将使用项目设置中声明的存储库。

settings.gradle.kts

@file:Suppress("UnstableApiUsage")

enableFeaturePreview("VERSION_CATALOGS")
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")

pluginManagement {
    includeBuild("build-logic")
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
    repositories {
        google()
        mavenCentral()
    }
}

rootProject.name = "GradleKotlinConventionPlugins"

include(":app")

在这里插入图片描述

共享逻辑复合模块

在设置脚本中启用版本目录功能后,我们开始使用新的复合模块。

settings.gradle.kts

@Suppress("UnstableApiUsage")
dependencyResolutionManagement {
    versionCatalogs {
        create("libs") {
            from(files("../gradle/libs.versions.toml"))
        }
    }
}

rootProject.name = "build-logic"

现在,我们将我们的新模块定义为Kotlin脚本,通过启用Kotlin DSL并强制使用预编译的脚本插件将其作为 Kotlin 源集的一部分。
因此,作为项目构建的组成部分的复合模块负责配置,这通常是我们在项目级 Gradle 构建脚本中处理的。 我们将 Gradle 特定的声明移动到那里。

build.gradle.kts

plugins {
    `kotlin-dsl`
    `kotlin-dsl-precompiled-script-plugins`
}

repositories {
    google()
    mavenCentral()
    gradlePluginPortal()
}

dependencies {
    implementation(libs.kotlin.gradlePlugin)
    implementation(libs.gradle)
}

tasks.test {
    useJUnitPlatform()
}

类型为基础的规范

在基于特征的模块化应用结构中,我们有主应用模块、功能模块和共享模块(用于一些可重用的逻辑或数据)等。

我们确定的主要规范插件包括:

  • Kotlin 库规范
  • Android 库规范
  • Android 可组合库规范

Kotlin 库规范

Kotlin 库惯例通常用于声明一些 API 或共享一些逻辑。它是一个覆盖了 JDK 版本的 Java 库。

kotlin-library-conventions.gradle.kts

plugins {
    `java-library`
    kotlin("jvm")
}

kotlin {
    jvmToolchain(jdkVersion = 11)
}

task("testUnitTest") {
    dependsOn("test")
}

gradle-kotlin

Kotlin Android 库规范

Kotlin Android 库规范适用于默认启用 ViewBinding 功能的特征模块。

kotlin-android-library-conventions.gradle.kts

plugins {
    id("com.android.library")
    kotlin("android")
}

@Suppress("UnstableApiUsage")
android {
    . . .

    compileOptions {
        isCoreLibraryDesugaringEnabled = true
        targetCompatibility = JavaVersion.VERSION_11
        sourceCompatibility = JavaVersion.VERSION_11
    }

    kotlinOptions {
        jvmTarget = JavaVersion.VERSION_11.toString()
    }

    buildFeatures {
        viewBinding = true
    }
}

dependencies {
    . . .
}

Kotlin Android Compose库规范

它是先前库约定的扩展,具有与 Jetpack Compose 相关的声明。

kotlin-android-composable-library-conventions.gradle.kts

plugins {
    id("kotlin-android-library-conventions")
}

@Suppress("UnstableApiUsage")
android {
    buildFeatures.compose = true
    composeOptions.kotlinCompilerExtensionVersion = libs.versionKotlinCompiler
}

dependencies {
    implementation(platform(libs.libAndroidxComposeBom))
    implementation(libs.libAndroidxComposeFoundation)
}

创建新模块时,通过应用传统插件和额外的依赖项来定义构建脚本会更加容易。我们也可以考虑将组合模块应用于另一个项目。

当我们创建一个新模块时,可以通过应用公约插件和附加的依赖项,更容易地定义构建脚本。我们还可以考虑将组合模块应用于另一个项目。

feature-build.gradle.kts

plugins {
    id("kotlin-android-library-conventions")
    id("test-conventions")
}

dependencies {
    implementation(libs.androidX.appCompat)
    implementation(libs.google.material)
}

结论

总之,模块化是我们解决诸多问题的主要关注点,如代码库大小、可扩展性、可读性、代码质量、代码重复等。我们通常会按照特性来划分模块,将特性代码进行隔离。Google Android团队最近也发布了一份应用程序模块化指南,采用了相同的方法。

https://developer.android.com/topic/modularization

但也有一些与版本目录相关的限制性问题。库不是直接可访问的,我们需要创建一些扩展函数来解决这个问题。插件在插件块中也不被识别。这个问题似乎在Gradle 8中已经得到解决。

您可以在我的Github规范repository中找到所有的源代码。

https://github.com/uteke/gradle-kotlin-convention-plugins

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/619097.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PLSQL Developer 14安装

资源 百度网盘: 链接:https://pan.baidu.com/s/1A4DeaKPF7y-0o90nVKFbZA?pwd6udw 提取码:6udw阿里网盘: PLSQL Developer 14破解版 https://www.aliyundrive.com/s/zUdgF98VCE3安装步骤 解压安装包后,获得PLSQL De…

chatgpt赋能python:Python如何访问网页

Python如何访问网页 Python是一种被广泛用于web开发、数据科学和人工智能的编程语言。但是,你知道Python还可以用于访问网页吗?在本文中,我们将介绍Python如何访问网页,帮助您了解Python的这一方面,并掌握它的实际应用…

什么是快捷支付?

快捷支付是一种便捷的支付方式,它允许用户使用预先绑定的银行卡或支付账户进行快速支付,无需重复输入卡号、密码等详细信息。 编辑搜图 请点击输入图片描述(最多18字) 在快捷支付中,用户可以在商家网站、移动应用或支…

详解YOLOv6.2 Repvgg-style 的高效backbone:EfficientRep

论文地址: https://arxiv.org/pdf/2302.00386v1.pdf github: https://github.com/meituan/YOLOv6/releases I. 引言 自从VGG在图像分类任务中取得成功以来,卷积神经网络设计已经引起了学术界和工业界的广泛关注。目前已经提出了大量经典网络,如Inception和Resnet等。这些精心…

【论文阅读笔记】Fast Bilateral Filtering for the Display of High-Dynamic-Range Images

论文地址:https://people.csail.mit.edu/fredo/PUBLI/Siggraph2002/DurandBilateral.pdf 论文小结 本文提出方法的目标是压缩高动态范围图像,使其能够用于显示。它可以在保留细节的同时降低对比度。   基本原理是将图像分为两个尺度:编码大…

软考知识总结

文章目录 一、计算机系统知识2. 总线包括:数据总线,地址总线,控制总线3. 原码 反码 补码 移码的转换4.计算机指令-流水线和吞吐率5. 漏洞扫描系统基本概念6.CISC和RISC7.[海明码计算](https://blog.csdn.net/alzzw/article/details/123402876…

MVCC在Mysql中的运用

MVCC到底是个啥? 定义: 多版本并发控制,字面理解,在并发过程中利用多个版本进行合理控制(反正我就是从字面这么理解),很明显,这个东西是个抽象的概念,事实也是如此。它主要是出现在…

OpenStack部署(二)

OpenStack部署 4. Glance4.1 创建Glance数据库并授权4.2 获得admin凭证4.3 创建glance用户并设置密码4.4 添加 admin 角色到 glance 用户和 service 项目上4.5 创建glance服务实体4.6 创建镜像服务的 API 端点4.7 yum安装Glance服务4.8 初始化镜像服务的数据库4.9 启动镜像服务…

中企出海,数智人力重构企智人效的人才供应体系

本文来自深度围观 中企出海一直是热度话题,综合来看,中企出海除了市场拓展、国际化战略、多元投资的因素之外,还有非常重要的一点是,全球供应链和资源整合。用友网络副总裁张月强总结为:“在产品国际化、区域经营国际…

在探索嵌入式系统世界的道路上选择51单片机

当我是一个初学者时,我发现选择51单片机是一个绝佳的决定。我发现51单片机基于Intel 8051架构,非常适合学习和教育领域的应用。刚好,我总结了一些嵌入式资料放在视频结尾。以下是为什么我认为51单片机是初学者的理想选择的一些原因&#xff1…

直播预告 | 在能媲美“真假美猴王”的AI面前,如何保持我们的“火眼金睛”

AI欺诈防护——业务安全大讲堂第二季第六期-CSDN直播https://live.csdn.net/room/dingxiangtech/7P3ME1HJ AI造谣层出不穷,险些引发社会恐慌 “2021年4月,上海某公司高管因对方使用AI换脸与人工生成的语音技术制作公司领导的面孔,并要该高管…

chatgpt赋能python:Python如何优化SEO?

Python如何优化SEO? Python已经成为一种非常流行的编程语言。专业人士使用Python编写众多应用程序,将其应用于各种行业和领域。众所周知,搜索引擎是市场营销的重要组成部分。SEO是在网站和搜索引擎结果页面上提高网站排名的过程。在这个过程…

ChatGPT时代:ChatGPT全能应用一本通

摘要 ChatGPT是一款开创性的人工智能语言模型,将人类语言理解和生成的能力推向了新的高度。作为一个全能的应用,ChatGPT能够在各个领域提供帮助和指导,从教育到医疗,从娱乐到商业。本文将探讨ChatGPT时代的到来,以及其…

三天吃透Spring面试八股文

摘自我的面试网站:topjavaer.cn Spring是什么? Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。最全面的Java面试网站:最全面的Java面试网站 Spring的优点 通过控制反转和依赖注入实现松耦合。支持面向切面的编程&#xff…

对话CEO:用高性价比AI视觉检测系统做客户坚盾,迎光伏行业新洗牌

“企业需要紧跟行业技术发展,要有前瞻性的预判和洞察,提前做好技术研发储备,下一阶段的光伏行业一定是更智能化的质效之争。我们能做的就是深入客户场景,将每一个细节做到极致,用高性价比的AI视觉产品为客户打造竞争的…

K8S之pod(十二)

一、简介 在Kubernetes集群中,Pod是所有业务类型的基础,也是K8S管理的最小单位级,它是一个或多个容器的组合。这些容器共享存储、网络和命名空间,以及如何运行的规范。在Pod中,所有容器都被统一安排和调度,…

《C++高级编程》读书笔记(四:设计专业的C++程序)

1、参考引用 C高级编程(第4版,C17标准)马克葛瑞格尔 2、建议先看《21天学通C》 这本书入门,笔记链接如下 21天学通C读书笔记(文章链接汇总) 1. 程序设计概述 在启动新程序(或已有程序的新功能&…

MMDetection环境配置与使用

在安装MMDetection时,耗费了近一天时间,其实安装很简单,只要保证环境对应即可(这不是废话吗),总而言之,只要严格按照步骤Windows下环境配置就是可行的。 Window环境配置 基础环境 CUDA为10.1 创建Conda环…

AWTK实现汽车仪表Cluster/DashBoard嵌入式GUI开发(三):移植

AWTK最大优势是什么?除了免费,一个是轻量级、速度快,还有一个就是跨平台,它是为移植而生,为嵌入式而生。 而嵌入式和桌面系统最大不同在于,桌面系统的CPU是intel/AMD的X86系统,操作系统时Windows/Linux,而嵌入式则更加多样,内核可能是ARM、RISC,不同厂家基于ARM内核设…

原来,网络机架的门道也这么多

大家好,我的网工朋友 前几天给你们说了机房搬迁,发现大家对硬件设备还挺感兴趣。还没看过的看这:《别小瞧,搬迁网络机房,讲究的可不少》。 之前大多给你分享技术和行业经验,这回来点“硬的”。 如果你做的…