//APP:
implementation project(‘A’)
implementation project(‘Foo’)
//A:
implementation project(‘B’)
implementation project(‘Bar’)
因为依赖传递性,APP其实依赖了A,Foo,B,Bar。其实就是一颗树中,除去根节点的节点集合。而对于一个非根节点,它被依赖的形式只有两种:
-
静态包,不需要重新编译,节约编译时间
-
module,需要再次编译,可以运用最新改动
我们可以定义这样一个键值对信息:
project.ext.depRules = [
“B”: “p”,
“A”: “a”
]
"p"代表使用project,"a"代表使用静态包。
并将这颗树的内容表达出来:我们先忽略掉Foo和Bar
project.ext.deps = [
“A” : [
“B”: [
“p”: project(’:B’),
“a”: ‘leobert:B:1.0.0’
]
],
“APP”: [
“A”: [
“p”: project(’:A’),
“a”: ‘leobert:A:1.0.0’
]
]
].with(true) {
A.each { e ->
APP.put(e.key, e.value)
}
}
以A为例,我们可以通过代码实现动态添加依赖:
project.afterEvaluate { p ->
println(“handle deps for:” + p)
deps.A.each { e ->
def rule = depRules.get(e.key)
println(“find deps of A: rule is” + rule + " ,dep is:" + e.value.get(rule).toString())
project.dependencies.add(“compileOnly”, e.value.get(rule))
}
}
同理,对于APP:
project.afterEvaluate { p->
println(“handle deps for:” + p)
deps.APP.each { e ->
def rule = depRules.get(e.key)
println(“find deps of App:rule is” + rule + " ,dep is:" + e.value.get(rule).toString())
project.dependencies.add(“implementation”, e.value.get(rule))
}
}
查看输出:
C
onfigure project :A
handle deps for:project ‘:A’
find deps of A: rule isp ,dep is:project ‘:B’
Configure project :app
handle deps for:project ‘:app’
find deps of App:rule isa ,dep