我目前正在为
Android开发自定义库.
我的想法是为应用程序创建一个版本(我目前在de build.gradle文件中设置它并且工作正常),以及该库的不同版本.
如果没有将两个build.gradle文件合并在一起,是否有最佳实践?
我在SO上发现了几个类似的问题,但他们已经4岁了,并没有多大帮助.
解决方法@H_502_10@
解决方案不是Git,因为你可能已经想到了. OP希望对库进行外部版本,可能是在不提供源代码的情况下向第三方提供API的方法.
这对Gradle来说并不是微不足道的,但它是可行的.
你可以在不同的层面上做到这一点,我将解释最容易和最直接的.
设置版本号
首先,您需要将一个版本变量添加到gradle.properties文件中.您可以使用简单的单行设置此变量:
版本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,patch,candidate) = [major,candidate].collect{it.toInteger()}
(major * 1000000) + (minor * 10000) + (patch * 100) + candidate;
}
}
完成此操作后,请确保在main build.gradle文件中包含versioning.gradle文件,方法是在Android插件的加载位置附近添加apply:’.. / version.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进行版本控制.这意味着开发人员无法通过方法调用动态获取版本号.
一定要有一个方法可以为客户端开发人员提供版本号,并确保两者保持同步.只有这样你才能拥有一个正确版本的库.
这对Gradle来说并不是微不足道的,但它是可行的.
你可以在不同的层面上做到这一点,我将解释最容易和最直接的.
设置版本号
首先,您需要将一个版本变量添加到gradle.properties文件中.您可以使用简单的单行设置此变量:
版本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,patch,candidate) = [major,candidate].collect{it.toInteger()} (major * 1000000) + (minor * 10000) + (patch * 100) + candidate; } }
完成此操作后,请确保在main build.gradle文件中包含versioning.gradle文件,方法是在Android插件的加载位置附近添加apply:’.. / version.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进行版本控制.这意味着开发人员无法通过方法调用动态获取版本号.
一定要有一个方法可以为客户端开发人员提供版本号,并确保两者保持同步.只有这样你才能拥有一个正确版本的库.