Skip to content

2、接入方式

JailedBird edited this page Dec 5, 2023 · 1 revision

ModuleExpose已适配kts和groovy语法,如果你的项目启用过kts,更推荐使用kts版本;对于Android开发者来说,使用kts也更方便看源码和自行修改代码;

以kts方式接入

示例工程:https://github.com/JailedBird/ModuleExpose

1、项目启用kts配置

  • 确保你的项目可以正确启用kts配置,并且能识别kts后缀文件;如因为项目过老等原因导致无法启用,请使用groovy配置;
  • 如果项目混用kts&groovy、并且选择kts版本接入,建议将settings.gradle迁移到settings.gradle.kts,避免混编等不必要问题;
  • 后续默认相关脚本均为 .kts 格式;

2、导入脚本到gradle目录&修改模板

请拷贝示例工程gradle/expose目录到个人项目gradle目录,拷贝后目录如下:

Path
ModuleExpose\gradle

gradle
│  libs.versions.toml
├─expose
│      build_gradle_template_android
│      build_gradle_template_java
│      build_gradle_template_expose
│      expose.gradle.kts
└─wrapper
        gradle-wrapper.jar
        gradle-wrapper.properties

其中:expose.gradle.kts是模块暴露的核心脚本,包含若干函数和配置参数;

其中:build_gradle_template_android和build_gradle_template_java脚本模板因项目不同而有所不同,需要自行根据项目修改,否则无法编译;

  • build_gradle_template_android,生成Android模块的脚本模板,注意高版本gradle必须配置namespace,因此最好保留如下的配置(细则见脚本如何处理的):

    android {
        namespace = "%s"
    }
    
  • build_gradle_template_java, 生成Java模块的脚本模板,配置较为简单;

  • includeWithExpose函数使用build_gradle_template_android模板生成Android Library模块

  • includeWithJavaExpose函数使用build_gradle_template_java模板生成Java Library模块

  • build_gradle_template_expose,不同于build_gradle_template_android、build_gradle_template_java的模板形式的配置,使用includeWithExpose、includeWithJavaExpose时,会优先检查模块根目录是否存在build_gradle_template_expose,如果存在则优先、直接将build_gradle_template_expose内容拷贝到module_expose, 作为build.gradle.kts ! 保留这个配置的原因在于:如果需要暴露的类,引用三方类如gson、但不便将三方库implementation到build_gradle_template_android,这会导致module_expose编译报错,因此为解决这样的问题,最好使用自定义module_expose脚本(拷贝module的配置、稍加修改即可)

    PS:注意这几个模板都是无后缀的,kts后缀文件会被IDE提示一大堆东西;

注意: Java模块编译更快,但是缺少Activity、Context等Android环境,请灵活使用;当然最灵活的方式是为每个module_expose单独配置build_gradle_template_expose (稍微麻烦一点);另外,如果不用includeWithJavaExpose,其实build_gradle_template_java也是不需要的;

3、settings.gradle.kts导入脚本函数

根目录settings.gradle.kts配置如下:

apply(from = "$rootDir/gradle/expose/expose.gradle.kts")
val includeWithExpose: (projectPaths: String) -> Unit by extra
val includeWithJavaExpose: (projectPaths: String) -> Unit by extra

(PS:只要正确启用kts,settings.gradle应该也是可以导入includeWithExpose的,但是我没尝试;其次老项目针对ModuleExpose改造kts时,可以渐进式改造,即只改settings.gradle.kts即可)

4、模块配置

将需要暴露的模块,在settings.gradle.kts 使用includeWithExpose(或includeWithJavaExpose)导入;

includeWithExpose(":feature:settings")
includeWithExpose(":feature:search")

即可自动生成新模块 ${module_expose};然后在模块源码目录下创建名为expose的目录,将需要暴露的文件放在expose目录下, expose目录下的文件即可在新模块中自动拷贝生成;

如图:

image-20231204171057867

image-20231204171204479

生成细则:

1、 模块支持多个expose目录(递归、含子目录)同时暴露,这可以避免将实体类,接口等全部放在单个expose,看着很乱

2、 expose内部的文件,默认全部复制,但脚本提供了开关,可以自行更改并配置基于文件名的拷贝过滤;

5、使用module_expose模块

请使用 compileOnly 导入项目,如下:

compileOnly(project(mapOf("path" to ":feature:search_expose")))

错误用法:会导致资源冲突

implementation(project(mapOf("path" to ":feature:search_expose")))

原理解释:compileOnly只参与编译,不会被打包;implementation参与编译和打包;

因此search_expose只能使用compileOnly导入,确保解耦的模块之间可以访问到类引用,但不会造成打包时2个类相同的冲突问题;

6、 添加clean module_expose

当clean项目,最好是能删除所有module_expose目录所有代码,保证代码的整洁性;由于这个无法写在脚本中去,因此只能在项目根build.gradle.kts中单独添加如下task任务;

task("clean").dependsOn("module_expose_clean")
// This task is used for delete xx_expose module
tasks.register("module_expose_clean"){
    doLast {
        println("execute clean expose")
        subprojects.forEach{ project->
            // Please exclude these project that you don't want to delete
            if(project.name.endsWith("_expose")){
                println("ModuleExpose: delete ${project.path}")
                project.projectDir.deleteRecursively()
            }
        }
    }
}

以groovy方式接入

示例子工程:https://github.com/JailedBird/ModuleExpose/tree/main/subproj/GradleSample

1、项目启用配置

  • 大多是使用groovy的项目,直接按照后续流程接入即可;
  • 后续默认相关脚本均为 .gradle 格式;

2、导入脚本到gradle目录&修改模板

请拷贝示例工程gradle/expose_gradle目录到个人项目gradle目录,拷贝后目录如下:

Path
ModuleExpose\gradle

gradle
├─expose_gradle
│      build_gradle_template_android
│      build_gradle_template_java
│      build_gradle_template_expose
│      expose.gradle
└─wrapper
        gradle-wrapper.jar
        gradle-wrapper.properties

相关规则和kts方案完全一致 ;请注意生成的模块配置文件为build.gradle 而非 build.gradle.kts

3、settings.gradle导入脚本函数

根目录settings.gradle配置如下:

rootProject.name = "Gradle sample"
apply from: "gradle/expose_gradle/expose.gradle"

4、模块配置

将需要暴露的模块,在settings.gradle 使用includeWithExpose(或includeWithJavaExpose)导入;

includeWithExpose(":app")
includeWithExpose ':mylibrary'
includeWithJavaExpose ':lib'

细节和kts方案完全一致;

5、使用module_expose模块

使用module_expose方式和kts方案一致;

6、 添加clean module_expose

当clean项目,最好是能删除所有module_expose目录所有代码,保证代码的整洁性;由于这个无法写在脚本中去,因此只能在项目根build.gradle.kts中单独添加如下task任务;这里的语法和kts稍有区别;

tasks.register("clean") {
    dependsOn("module_expose_clean")
}

tasks.register("module_expose_clean") {
    doLast {
        println("execute clean expose")
        subprojects { project ->
            // Please exclude these projects that you don't want to delete
            if (project.name.endsWith("_expose")) {
                println("ModuleExpose: delete ${project.path}")
                project.projectDir.deleteDir()

            }
        }
    }
}