需求背景

在开发过程中,我们经常需要给应用添加版本信息,以便于追踪和管理应用的版本。

对于windows平台,直接在Project->Project Options...对话框中的Project Options->Version Info内进行设置即可。

但是,对于非windows平台,该方案便不可行。

而且,该方案还存在一个明显的问题:版本信息需要手动维护,未能与版本控制系统进行有效关联,很可能出现应用与源码不一致的情况。

解决思路

  1. 不使用Version Info功能,但取其把版本信息编译到可执行文件中的思想。

  2. 借鉴vscode关于方案,版本信息中包含版本号提交ID即可使应用和源码进行关联。

  3. 只要解决了在构建时动态获取版本信息的问题,便可以解决该问题。

解决方案

经多种尝试,最终确定的方案如下:

  1. 在源码中添加ver.inc文件,用于存储版本信息,在关于界面等进行展示。

  2. 编写脚本,获取版本信息并写入ver.inc文件。

  3. 打开Project->Project Options...对话框,在Compiler Options->Compiler Commands->Execute before中添加脚本的路径。

  1. 正常构建应用即可。

  2. 如要跨平台,可分别编写对应平台的脚本并创建对应的Build mode,在Build modes中选择对应的模式,然后配置对应的脚本,正常构建即可。

附脚本

以使用git为例:

windows

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
@echo off

::获取版本号
git describe --tags >nul 2>nul
if errorlevel 1 (
    set VER_NO=0.0
) else (
    for /f "delims=" %%a in ('git describe --tags') do set VER_NO=%%a
)

::获取提交id
git rev-parse HEAD >nul 2>nul
if errorlevel 1 (
    set COMMIT_ID=0000000000000000000000000000000000000000
) else (
    for /f "delims=" %%b in ('git rev-parse HEAD') do set COMMIT_ID=%%b
)

::写入文件
echo const > ver.inc
echo VER_NO = '%VER_NO%'; >> ver.inc
echo COMMIT_ID = '%COMMIT_ID%'; >> ver.inc

linux

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/bin/bash

# 获取版本号
VER_NO=$(git describe --tags 2>/dev/null)
if [ $? -ne 0 ]; then
    VER_NO="0.0"
fi

# 获取提交ID
COMMIT_ID=$(git rev-parse HEAD 2>/dev/null)
if [ $? -ne 0 ]; then
    COMMIT_ID="0000000000000000000000000000000000000000"
fi

# 写入文件
echo "const" > ver.inc
echo "VER_NO = '$VER_NO';" >> ver.inc
echo "COMMIT_ID = '$COMMIT_ID';" >> ver.inc