1. 今天看到一个问题,问如何保证软件发行版本与开发人员代码一至性的问题。


1.1 我觉得需要从两个方面入手:

  1. 软件的编译发行需要制度化管理,最好专人负责并配置专用编译环境。
  2. 也是我准备重点说明的,把软件代码版本编译到发行版本中,供查证需要。


1.2 version.h

在编译软件时,我会通过调用一个脚本获取git的代码提交信息,生成version.h文件,这其中就是当前编译的代码的版本信息和当前编译时间。

在你需要确认当前发行版本所对应的代码版本时,就可以查看此信息进行比对。

1.3 build_ver.sh

  1. 获取代码提交信息
    git rev-list HEAD | sort > config.git-hash
    
  2. 版本计数可以按git的提交次数来生成
     git rev-list origin/master | sort | join config.git-hash - | wc -l | awk '{print $1}'
    
  3. 如果当前代码设置git tag,则直接取当前最新tag做为版本信息
    git describe --always --tags \`git rev-parse HEAD\` | awk -F "-1-" '{print $1}'
    
  4. 对于当前编译代码中存在未提交代码也要做判断
     if LANG=en_GB git status | grep -q "modified:" ; then
         MOD="M"
     fi
    

1.4 样例

//! @wfeii@163.com
//! 
#ifndef __WII_SVC_LOADER_VERSION_H__
#define __WII_SVC_LOADER_VERSION_H__
#define VER_MAJOR "2"                                /* 自定义的主版本号 */
#define VER_MINOR "0"
#define VER_MICRO "34"                               /* 根据commit次数年计算的子版本号 */ 
#define BUILD_VERSION "master - r2.0.34M 5452a9b"    /* master是代码分支 r2.0.34是版本号 M代表有未提交代码 5452a9b是commit的id值前7位 */
#define BUILD_TIME "2021-03-22#12:11:43"             /* 编译时间 */
#endif //! __WII_SVC_LOADER_VERSION_H__
$ ./release/sapiloader -V
2.0.34
$ ./release/sapiloader -vV
sapiloader(13979) -- master - r2.0.34M 5452a9b -- 2021-03-22#12:11:43

1.5 调用

这个脚本的调用最好加到Makefile中,或CMakeLists.txt中,加在Makefile中是最保险的。