项目场景:
项目需要在APP中显示当前的版本号,考虑到git共同开发,显示git版本,查找bug或恢复设置更为便捷。
使用需求:
显示的内容包括哪个分支编译的,版本号多少,编译时间,以及是否Release版本,例如以下类似显示。
"dev_6c01ges6116e__2023-08-08[16:05:37]_DI"
"origin_9n5ggi20ckah__2023-08-08[16:05:37]"
解决方案:
大致思路是通过脚本,预先拉取git信息到某文件,应用程序使用时拉取该文件内的数据。
- linux脚本 .sh
#!/usr/bin/env bash
VERSION_FILE=./winver.h
VERSION_STR=$(git rev-parse --short=12 HEAD)
BRANCH_STR=$(git rev-parse --abbrev-ref HEAD)
BUILD_TIME=`date +"%Y-%m-%d[%H:%M:%S]"`
echo $BUILD_TIME
[ -n "$(git status --porcelain)" ] &&GIT_IS_DIRTY="_DI"
UPDATE_LINE_TO="#define PC_VERSION \"${BRANCH_STR}_${VERSION_STR}__${BUILD_TIME}${GIT_IS_DIRTY}\""
echo $UPDATE_LINE_TO >$VERSION_FILE
- windows脚本 .bat
for /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set curdate=%%a-%%b-%%c)
for /f "tokens=1-3 delims=:." %%a in ('echo %time%') do (set curtime=%%a:%%b:%%c)
set BUILD_TIME=%curdate%[%curtime%]
echo %BUILD_TIME%
for /f "tokens=*" %%a in ('git rev-parse --short^=12 HEAD') do (set VERSION_STR=%%a)
for /f "tokens=*" %%a in ('git rev-parse --abbrev-ref HEAD') do (set BRANCH_STR=%%a)
set GIT_IS_DIRTY=
for /f "tokens=*" %%a in ('git status --porcelain^|find /v /c ^"^"') do (set dc=%%a)
if dc gtr 0 set GIT_IS_DIRTY=_DI
set UPDATE_LINE_TO=#define WIN_VERSION "%BRANCH_STR%_%VERSION_STR%__%BUILD_TIME%%GIT_IS_DIRTY%"
echo %UPDATE_LINE_TO%>winversion.h
- 在项目.pro中添加以下内容
versionTarget.target = version.cpp
versionTarget.depends = FORCE
win32 {
versionTarget.commands = cd $$PWD && pre_build.bat
}
unix {
versionTarget.commands = cd $$PWD;./pre_build.sh
}
PRE_TARGETDEPS += version.cpp
QMAKE_EXTRA_TARGETS += versionTarget
程序中直接调用
winver.h
#define WIN_VERSION "dev_6c01ges6116e__2023-08-08[16:05:37]_DI"