• 记录每天学习的新知识:Composing builds


    一、啥是 Composing builds ??

    https://docs.gradle.org/current/userguide/composite_builds.html

    摘自 Gradle 文档:
    复合构建只是包含其他构建的构建.
    在许多方面,复合构建类似于 Gradle 多项目构建,不同之处在于,它包括完整的 builds ,而不是包含单个 projects

    • 组合通常独立开发的构建,例如,在应用程序使用的库中尝试错误修复时
    • 将大型的多项目构建分解为更小,更孤立的块,可以根据需要独立或一起工作

    使用这种方式的优点有:

    1. 支持单向跟踪
    2. 自动补全
    3. 依赖更新时,不会重新构建整个项目

    二、使用

    环境:
    Android Studio Chipmunk | 2021.2.1 Patch 2
    Build #AI-212.5712.43.2112.8815526, built on July 10, 2022
    Runtime version: 11.0.12+7-b1504.28-7817840 amd64

    • 插件Moudle全部代码结构如下:

    在这里插入图片描述

    简洁一下:

    1. .gradle 是系统编译出来的;
    2. libs 啥也没,可以删
    3. Config 写依赖的位置
    4. VersionPlugin 实现插件接口
    5. .gitignore啥也没,可以删
    6. build.gradle 需要配置插件
    7. setting.gradle 空实现,Moudle需要此文件

    1、 于项目中新建 Moudle,取名 VersionPlugin

    在这里插入图片描述

    2、重写 VersionPlugin 的 build.gradle (区分Moudle语言)

    原gradle内的内容,全部删除

    有两种写法,对应上面的语言,如果你使用的是

    • Java ,配置 build.gradle 如下:
    
    apply plugin: 'java-gradle-plugin'
    
    buildscript {
        repositories {
            google()
            maven { url 'https://jitpack.io' }
            maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
            maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
            gradlePluginPortal()
            mavenCentral()
        }
    }
    
    repositories {
        google()
        maven { url 'https://jitpack.io' }
        maven {url 'https://maven.aliyun.com/nexus/content/repositories/releases/'}
        maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
        maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
        mavenCentral()
    }
    
    dependencies {
        implementation gradleApi()
    }
    
    gradlePlugin {
        plugins {
            version {
                id = 'com.yoshin.versionplugin'
                implementationClass = 'com.yoshin.versionplugin.VersionPlugin'
            }
        }
    }
    
    
    • 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
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • Kotlin,配置 build.gradle 如下:
    apply plugin: 'kotlin'
    apply plugin: 'java-gradle-plugin'
    
    buildscript {
        repositories {
            google()
            maven { url 'https://jitpack.io' }
            maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
            maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
            gradlePluginPortal()
            mavenCentral()
        }
    
        dependencies {
            // 因为使用的 Kotlin 需要需要添加 Kotlin 插件,需要和主工程对应,不然就出现两个版本了
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10"
        }
    
    }
    
    repositories {
        google()
        maven { url 'https://jitpack.io' }
        maven {url 'https://maven.aliyun.com/nexus/content/repositories/releases/'}
        maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
        maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
        mavenCentral()
    }
    
    dependencies {
        implementation gradleApi()
        implementation "org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10"
    }
    
    compileKotlin {
        kotlinOptions {
            jvmTarget = "1.8"
        }
    }
    
    compileTestKotlin {
        kotlinOptions {
            jvmTarget = "1.8"
        }
    }
    
    gradlePlugin {
        plugins {
            version {
                // 在 app 模块需要通过 id 引用这个插件
                id = 'com.yoshin.version'
                // 实现这个插件的类的路径
                implementationClass = 'com.yoshin.version.VersionPlugin'
            }
        }
    }
    
    • 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
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    3、需要在Moudle下添加setting.gradle文件

    空文件即可,啥也不用写

    4、修改项目的setting.gradle文件

    ....
    
        }
    }
    rootProject.name = "DemoComposingBuilds"
    include ':app'
    includeBuild('VersionPlugin')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    添加:

    includeBuild('VersionPlugin')
    
    • 1

    添加完这个,可以编译了。

    5、实现VersionPlugin

    import org.gradle.api.Plugin;
    import org.gradle.api.Project;
    
    public class VersionPlugin implements Plugin<Project> {
    
        @Override
        public void apply(Project project) {
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    6、配置项目依赖和版本号 ==

    public class Config {
    
        public static  String cardview = "androidx.cardview:cardview:1.0.0";
        public static  String  material = "com.google.android.material:material:1.4.0";
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    7、使用插件引用依赖

    plugins {
        id 'com.android.application'
        id 'org.jetbrains.kotlin.android'
        //下面这行必须有,引用插件框架
        id "com.yoshin.versionplugin" 
    }
    
    //下面这行必须有,为了添加包下的类
    import com.yoshin.versionplugin.* 
    
    android {
    	...}
    
    dependencies {
    
    	...//下面这行是引用依赖
        implementation Config.material
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    注意:第二步使用的是Kotlin的时候,出现了在工程中 引用 Config类 引用不到的场景,还没找到原因。硬写也好使。整明白再更。

    三、遇见的异常

    1、引用不到类

    详细记录上述问题:在使用Kotlin编写Plugin时发生,目前尚未解决

    添加了代码: id “com.yoshin.versionplugin” import com.yoshin.versionplugin.* 后可以编译通过,但是 import com.yoshin.versionplugin.Config 这个就引用不到了,报红。

    但是, implementation Config.material 硬写也好用

    2、kotlin-gradle-plugin 插件冲突

    注意,插件中的build.gradle文件中的 kotlin-gradle-plugin 版本要和主工程对应。

    如插件中的build.gradle:

    "org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10"
    
    • 1

    项目中:

    plugins {
        id 'com.android.application' version '7.2.2' apply false
        id 'com.android.library' version '7.2.2' apply false
        id 'org.jetbrains.kotlin.android' version '1.7.10' apply false
        id 'org.jetbrains.kotlin.jvm' version '1.7.10' apply false
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    参考地址

    Android Studio统一依赖管理Composing builds:https://blog.csdn.net/Json_Jerry/article/details/112860914

  • 相关阅读:
    在spring中使用Validated和@Valid对参数进行校验
    【数据结构】详解链表(一)——单链表(动图讲解)
    python django病人跟踪治疗信息管理系统-项目源码Vue
    APOLLO UDACITY自动驾驶课程笔记——感知、预测
    <模板进阶>——《C++高阶》
    leetcode 6151. 统计特殊整数
    Redis篇---第六篇
    asp毕业设计——基于asp+access的在线人才招聘网设计与实现(毕业论文+程序源码)——人才招聘网
    王兰去(黑客)自学
    基于Springboot的美容院管理系统(有报告)。Javaee项目,springboot项目。
  • 原文地址:https://blog.csdn.net/weixin_35691921/article/details/126381834