仓库源码依赖管理器(三)

如何动态替换依赖?

前两篇我们说了下如何定义依赖描述文件,如何动态生成描述文件,那有了这些信息,我们该怎么去动态替换依赖?

如果要把线上依赖替换为本地Project依赖,先要把本地Project include进当前业务工程。在这之前先加载依赖描述文件进内存,如下:

1
2
def shell = new GroovyShell(this.getClass().getClassLoader())
shell.evaluate(new File("依赖描述文件路径"))

注:在依赖描述文件里,记得引用DSL使用的类,例:

1
2
import xxx.Module
@groovy.transform.BaseScript Module module

然后循环迭代依赖描述 List,根据描述信息include相应的工程,如下:

1
2
3
def projectName = ":模块名字"
settings.include(projectName)
settings.project(projectName).projectDir = new File("模块本地路径")

到这一步,需要包含的Project已经包含了进来,在AS工程栏就可以看到包括进来的模块了。

需要替换的模块已经包含进来了,下一步就是根据依赖描述配置信息替换线上依赖,基本思路如下:

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
project.afterEvaluate {
//寻找当前节点
def currentItem = modules.find {
project.name == it.name
}
if (currentItem == null) return
// 寻找子节点
List<String> seeds = currentItem.seeds
if (seeds == null) return
// 迭代子节点
seeds.each { seedName ->
// 寻找子节点对象
def seed = modules.find {
it.name == seedName
}
if (seed == null) return
if (seed.on_off) {
// 根据模块名字和group去除线上依赖
Map<String, String> map = new HashMap<>()
map.put("module", seed.name)
map.put("group", "xxx")
project.configurations.compile.exclude(map)
// 添加本地Project依赖
project.dependencies.add("api", project.dependencies.project([path: ":" + seed.name]))
}
}
}

现在线上依赖已经替换为本地模块,在代码里点击相应模块的引用已经自动跳转到本地。

仓库源码依赖管理器基本的功能已经完成了,如果需要调试模块的本地代码,只需要在源码依赖描述里把相应模块开关打开即可,是不是很方便?

仓库源码依赖管理器大概就是这些内容。

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2017-2023 Jacky

所有的相遇,都是久别重逢

支付宝
微信