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

如何动态生成依赖描述?

上一篇我们定义了依赖描述的基本格式,如下:

1
2
3
4
5
module {
on_off true
name "我是名字"
path "/path"
}

如果我们想做的更通用,能让其他业务工程方便的接入仓库源码依赖,那每一次接入的时候都要编写大量的依赖描述,而且每一次依赖变了,都需要手动修改描述文件。那可不可以动态生成依赖描述?

我们都知道有一个androidDependencies任务,执行任务会把工程的依赖在控制台输出,如果我们实现类似的任务,可以扫描出当前的依赖关系,然后根据我们的依赖描述定义输出为DSL文件就可以解决了。

我们在任务执行期间可以拿到project config 信息,然后根据第一级的依赖信息生成节点依赖信息,然后递归查找当前节点的子节点,最后就可以生成类似树状的依赖关系,基本思路如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
project.configurations.each { config ->
// 这里可以添加些异常检查
config.resolvedConfiguration.firstLevelModuleDependencies.each { dep ->
def generateModuleDep
generateModuleDep = { resolvedDep ->
// 这里可以根据 resolvedDep moduleGroup moduleName 等信息生成当前依赖信息
resolvedDep.children.each { childResolvedDep ->
if (resolvedDep in childResolvedDep.getParents()) {
// 子节点递归扫描依赖
generateModuleDep(childResolvedDep)
}
}
}
generateModuleDep(dep)
}
}

节点的信息可以按照实际情况存储到相应的数据结构中,我这里是把节点的对象直接存到List中。

现在我们已经获取到各个节点的信息了,那我们怎么把节点信息导出为文件呢?

groovy 支持使用模板生成字符串,生成文件当然也是可以的。

先定义一个依赖描述模板,如下:

1
2
3
4
5
module {
on_off ${on_off}
name ${name}
path ${path}
}

下一步定义一个节点信息Map,如下:

1
2
3
4
5
def binding = [
on_off : true, // 节点信息的开关值
name : "节点信息的名字",
path : "节点的路径",
]

最后根据上面定义的模板和节点信息Map,输出格式化的字符串。

1
2
def template = new StreamingTemplateEngine().createTemplate("描述依赖模板")
String response = template.make("节点信息Map")

模板引擎的make函数返回就是已经填好内容的格式化字符串,根据输出的字符串就可以输出到依赖描述文件。

现在在业务工程执行当前的任务,就可以动态生成依赖描述文件。

下一篇我们将结合这两篇的内容说下如何动态替换依赖。

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

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

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

支付宝
微信