-
Notifications
You must be signed in to change notification settings - Fork 0
2、接入方式
ModuleExpose已适配kts和groovy语法,如果你的项目启用过kts,更推荐使用kts版本;对于Android开发者来说,使用kts也更方便看源码和自行修改代码;
示例工程:https://github.com/JailedBird/ModuleExpose
- 确保你的项目可以正确启用kts配置,并且能识别kts后缀文件;如因为项目过老等原因导致无法启用,请使用groovy配置;
- 如果项目混用kts&groovy、并且选择kts版本接入,建议将settings.gradle迁移到settings.gradle.kts,避免混编等不必要问题;
- 后续默认相关脚本均为 .kts 格式;
请拷贝示例工程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也是不需要的;
根目录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即可)
将需要暴露的模块,在settings.gradle.kts 使用includeWithExpose(或includeWithJavaExpose)导入;
includeWithExpose(":feature:settings")
includeWithExpose(":feature:search")
即可自动生成新模块 ${module_expose}
;然后在模块源码目录下创建名为expose的目录,将需要暴露的文件放在expose目录下, expose目录下的文件即可在新模块中自动拷贝生成;
如图:
生成细则:
1、 模块支持多个expose目录(递归、含子目录)同时暴露,这可以避免将实体类,接口等全部放在单个expose,看着很乱
2、 expose内部的文件,默认全部复制,但脚本提供了开关,可以自行更改并配置基于文件名的拷贝过滤;
请使用 compileOnly
导入项目,如下:
compileOnly(project(mapOf("path" to ":feature:search_expose")))
错误用法:会导致资源冲突
implementation(project(mapOf("path" to ":feature:search_expose")))
原理解释:compileOnly只参与编译,不会被打包;implementation参与编译和打包;
因此search_expose只能使用compileOnly导入,确保解耦的模块之间可以访问到类引用,但不会造成打包时2个类相同的冲突问题;
当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()
}
}
}
}
示例子工程:https://github.com/JailedBird/ModuleExpose/tree/main/subproj/GradleSample
- 大多是使用groovy的项目,直接按照后续流程接入即可;
- 后续默认相关脚本均为 .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
根目录settings.gradle配置如下:
rootProject.name = "Gradle sample"
apply from: "gradle/expose_gradle/expose.gradle"
将需要暴露的模块,在settings.gradle 使用includeWithExpose(或includeWithJavaExpose)导入;
includeWithExpose(":app")
includeWithExpose ':mylibrary'
includeWithJavaExpose ':lib'
细节和kts方案完全一致;
使用module_expose方式和kts方案一致;
当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()
}
}
}
}
基于模块暴露和Hilt的安卓模块通信方案