Qt构建时自动生成版本号
在项目中手动改版本号是个麻烦事。于是花点时间写了脚本自动从git的分支名或tag来获取版本号。
其实说是自动也不严谨,毕竟git的分支与标签需要还是人来操作的,但至少避免了在项目中手写版本号的过程。
如果本文对你有所帮助,你可以点赞、收藏、分享甚至是打赏,欢迎留下评论交流。
如果需要转载,也烦请在转载的文章中添加本文的地址。
版本号规则
相关文章较多,不知贴那篇合适,故直接在此做个大概说明。 生成的版本号:{MAJAR_NUMBER}.{MINOR_NUMBER}.{CHANGE_NUMBER}.{BUILD_NUMBER}
MAJAR_NUMBER 为大版本号,当出现新旧版本无法兼容时,递增。(比如旧版本与服务器版本完全无法兼容。)
MINOR_NUMBER 为中版本号,当大版本号递增时,归零。否则,当增加新功能时,递增。
CHANGE_NUMBER 为小版本号,当大版本号或小版本号递增时,归零。否则,每次发布,递增。(一般是BUG修复、优化,遗漏等)
BUILD_NUMBER 为构建版本号,每次发布增加,但不一定每次+1,因为我们使用了提交次数统计来作为构建版本号的。
大版本号、中版本号、小版本号的读取
读取规则:
会优先从release分支读取版本号,release分支名规则release/v{MAJAR_NUMBER}.{MINOR_NUMBER}.{CHANGE_NUMBER} 比如分支名为`release/v1.2.3`时,有版本号`1.2.3.{BUILD_NUMBER}`
如果当前分支名不是release分支时(即名字不符合release分支名规则),会从时间距离最近的标签名读取版本号,标签名规则v{MAJAR_NUMBER}.{MINOR_NUMBER}.{CHANGE_NUMBER} 比如tag名为`v1.2.3`时,有版本号`1.2.3.{BUILD_NUMBER}`,我们一般在master分支上添加这种标签。
构建版本号的读取
构建版本号的获取做的比较简单:git rev-list HEAD --count
具体实现
有文件get-version-from-git.pri
# get-version-from-git.pri
# 版本号构成 MAJAR_NUMBER.MINOR_NUMBER.CHANGE_NUMBER.BUILD_NUMBER
message(/**************[START] reading app version**************/)
MAJAR_NUMBER = 0
MINOR_NUMBER = 0
CHANGE_NUMBER = 0
BUILD_NUMBER = 0
# 从git分支名中,读取 大、中、小版本。若当前分支不是发布分支,将尝试从最近git标签中读取。
exists(.git) {
#git提交数作为构建版本号。
BUILD_NUMBER = $$system(git rev-list HEAD --count)
#git分支名称
GIT_BRANCH = $$system(git symbolic-ref --short -q HEAD)
message(git branch = $$GIT_BRANCH)
GIT_BRANCH_PREFIX = $$str_member($$GIT_BRANCH,0,7)
equals(GIT_BRANCH_PREFIX,"release/"){
VERSION_NUMBER_STRING = $$replace(GIT_BRANCH,[^0-9+|\.],"")
VERSION_NUMBER_LIST = $$split(VERSION_NUMBER_STRING,".")
VERSION_NUMBER_LIST_SIZE = $$size(VERSION_NUMBER_LIST)
}else{
message("current git branch is not release branch, release branch name should start withs 'release/'.")
}
lessThan(VERSION_NUMBER_LIST_SIZE,3){
message("can not read version from git branch name, try to read version from nearest git tag.")
GIT_NEAREST_TAG = $$system(git describe --tags)
message(git nearest number = $$GIT_NEAREST_TAG)
VERSION_NUMBER_STRING = $$replace(GIT_NEAREST_TAG,[^0-9+|\.],"")
VERSION_NUMBER_LIST = $$split(VERSION_NUMBER_STRING,".")
VERSION_NUMBER_LIST_SIZE = $$size(VERSION_NUMBER_LIST)
}
greaterThan(VERSION_NUMBER_LIST_SIZE,2){
MAJAR_NUMBER = $$member(VERSION_NUMBER_LIST,0)
MINOR_NUMBER = $$member(VERSION_NUMBER_LIST,1)
CHANGE_NUMBER = $$member(VERSION_NUMBER_LIST,2)
VERSION = $$MAJAR_NUMBER"."$$MINOR_NUMBER"."$$CHANGE_NUMBER"."$$BUILD_NUMBER
system(echo "VERSION=$$VERSION">version.pri)
}else{
include(version.pri)
message("can not read version from git! using version.pri")
}
} else {
include(version.pri)
message("can not read version from git! using version.pri")
}
message(majar number = $$MAJAR_NUMBER)
message(minor number = $$MINOR_NUMBER)
message(change number = $$CHANGE_NUMBER)
message(build number = $$BUILD_NUMBER)
message(app version = $$VERSION)
message(/***************[END] reading app version***************/)
在构建动态库或者应用的pro文件中添加include(get-version-from-git.pri)。
目前遇到的问题
非常奇怪的,这个脚本在我的Windows上很容易导致QtCreator奔溃,但是在其他同事的机器上似乎没有这个问题。 我的QtCreator信息:
如果各位有相关问题的文章或QtCreater奔溃的排查方法,烦请在评论中留言帮我一把...