返回历史记录
我有这个android库aar
,devs可以正常使用
compile 'com.companyname.sdk:android-sdk:2.x'
现在我们正在从头开始重新编写库来创建V3。
在这次重新组织中,我们设法将lib分解为模块。所以可以说在V3上我们会有以下工件
compile 'com.companyname.sdk:core:3.x'
compile 'com.companyname.sdk:extra_1:3.x'
compile 'com.companyname.sdk:extra_2:3.x'
compile 'com.companyname.sdk:extra_ ....
这将在gradle结构上提供以下模块:
root:
|- test_app (apk just for testing, not deployed anywhere)
|- sdk (aka: core)
|- extra_1
|- extra_2
|- extra_ ... etc
对于extra
上的每个build.gradle
模块,都有一个provided (':sdk')
,因此可以使用sdk
模块中的所有内容,但实际上并不是自己编译它。
但我还想为现有的主机应用提供简单的迁移路径。这意味着,我希望V3上还有以下工件,它结合了core
和extra_1
(它基本上是V2上的当前内容)。
compile 'com.companyname.sdk:android-sdk:3.0.0'
理论上说这一切听起来都不错,但是我很难将它想象成一个gradle结构,以便我轻松导出所有这些。
我想要实现的目标
所以我希望能够在构建期间生成以下工件:
android-sdk
包含core
和extra_1
core
extra_1
我尝试了什么
添加一个名为legacy
的额外模块,在没有任何代码的情况下应用com.android.library
,并为其他模块添加compile project
。它会生成一个空的aar
使用两个模块中的sourceSets添加核心/旧版buildTypes。从未生成2 aar
使用两个模块中的sourceSets添加core / legacy productFlavours。不编译,因为它无法找到sdk
中声明为extra_1
的导入(其中一些是在注释处理器或lombok期间生成的)
使用compile project('extra_1')
添加core / legacy productFlavours。不编译,因为sdk和extra_1之间存在循环依赖关系。
答案
根据Gabrielle的回答,我最终挖掘了更多,并发现创建带有依赖项的额外模块的选项是正确的。它将生成一个空清单和空类的AAR。但重要的是它将生成的POM文件将包含正确的依赖项。
该方法的一个警告是maven-publish
插件的配置。通常,您需要一个publishing
对象publications
和pom.withXml
节点。我的就像是:
pom.withXml {
def root = asNode()
def license = root.appendNode('licenses').appendNode('license')
license.appendNode('name', 'The Apache Software License, Version 2.0')
license.appendNode('url', 'http://www.apache.org/licenses/LICENSE-2.0.txt')
license.appendNode('distribution', 'repo')
def dependenciesNode = asNode().appendNode('dependencies')
configurations.compile.allDependencies.each { dependency ->
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', dependency.group)
dependencyNode.appendNode('artifactId', dependency.name)
dependencyNode.appendNode('version', dependency.version)
}
}
该方法的问题是dependency.version
(最后)未指定,因此它生成一个<version>unspecified</version>
的POM文件。
解决方案很简单,用脚本上的一些变量代替正确的版本号。我看起来像:
dependencyNode.appendNode('version', "${rootProject.ext.SDK_VERSION}")
答案 0 :(得分:2)
你应该这样做:
root:
|- test_app (apk just for testing, not deployed anywhere)
|- core
|- extra_1
|- extra_2
|- extra_ ... etc
|- android-sdk
在core/build.gradle
:
apply plugin: 'com.android.library'
//...
在extra1/build.gradle
:
apply plugin: 'com.android.library'
//...
dependencies {
compile project(':core')
}
在android-sdk/build.gradle
:
apply plugin: 'com.android.library'
//...
dependencies {
compile project(':core')
compile project(':extra')
}