我目前正在为Android开发自定义库。
我的想法是为应用程序创建一个版本(我目前在de build.gradle文件中设置它并且工作正常),以及该库的不同版本。
如果没有将两个build.gradle文件合并在一起,是否有最佳实践?
我在SO上发现了几个类似的问题,但他们已经4岁了,并没有太大帮助。
答案 0 :(得分:3)
对此的解决方案不是Git,因为您可能已经想到了。 OP希望外部版本库,可能是在不提供源代码的情况下向第三方提供API的方法。
这对Gradle来说并不是一件容易的事,但它是可行的。
你可以在不同的层面上做到这一点,我会解释最容易和最直接的。
首先,您需要在version
文件中添加gradle.properties
变量。您可以使用简单的单行设置此变量:
version=0.1.0-SNAPSHOT
在你的项目中创建一个名为versioning.gradle
的文件并粘贴以下代码(我很久以前在网上找到了这个,我不再有源代码):
ext {
/**
* Builds an Android version code from the version of the project.
* This is designed to handle the -SNAPSHOT and -RC format.
*
* I.e. during development the version ends with -SNAPSHOT. As the code stabilizes and release nears
* one or many Release Candidates are tagged. These all end with "-RC1", "-RC2" etc.
* And the final release is without any suffix.
* @return
*/
buildVersionCode = {
//The rules is as follows:
//-SNAPSHOT counts as 0
//-RC* counts as the RC number, i.e. 1 to 98
//final release counts as 99.
//Thus you can only have 98 Release Candidates, which ought to be enough for everyone
def candidate = "99"
def (major, minor, patch) = version.toLowerCase().replaceAll('-', '').tokenize('.')
if (patch.endsWith("snapshot")) {
candidate = "0"
patch = patch.replaceAll("[^0-9]","")
} else {
def rc
(patch, rc) = patch.tokenize("rc")
if (rc) {
candidate = rc
}
}
(major, minor, patch, candidate) = [major, minor, patch, candidate].collect{it.toInteger()}
(major * 1000000) + (minor * 10000) + (patch * 100) + candidate;
}
}
完成此操作后,请务必在主versioning.gradle
文件中加入build.gradle
文件,方法是在加载Android插件的位置附近添加apply from: '../versioning.gradle'
。
然后,在defaultConfig块中,您希望将默认版本变量更改为以下值:
versionCode buildVersionCode()
versionName version
如果您真正构建了Android库,那么预期的输出就是.aar
文件。
因此,请将以下gradle代码添加到build.gradle
文件中:
libraryVariants.all {
variant -> variant.outputs.each {
output -> output.outputFile = new File(
output.outputFile.parent,
output.outputFile.name.replace(".aar", "-${defaultConfig.versionName}.aar")
)
}
}
那就是它!您的输出文件将具有您在gradle.proprties
文件中指定的版本号的名称。
这将以非常静态的方式对您的库和/或API进行版本控制。这意味着开发人员无法通过方法调用动态获取版本号。
确保还有一个可用的方法为客户端开发人员提供版本号,并确保两者保持同步。只有这样你才能拥有一个版本合适的库。
答案 1 :(得分:-3)
你为什么要这样做?
如果问题是您需要能够根据版本使用库在程序中执行不同的操作,那么只需在库中的某处创建一个公共静态最终常量。
如果原因是装饰性的(例如,用于演示),那么只需将其放入您的自述文件,更改日志或您需要的任何地方。为此目的弄乱构建文件是个坏主意。
根据您的解释:
我建议在这种情况下将它放在库的AndroidManifest.xml中(android:versionCode和android:versionName)。这就是谷歌对他们自己的许多库所做的事情,而且它在构建过程中是无害的。