如果用自动构建,版本信息是一个让人头疼的问题。
版本信息应该包含以下三个方面:
模块名称:foo
版本号:v1.1.1
构建信息: 132
构建信息通常是git/svn中的记录数,这样可以保证找BUG的时候能对的上版本;
版本信息写死在代码里可能引发如下问题:
- 程序中的版本号和打包的版本号一时手误就对不上了;
- 并非每次提交都需要修改版本号,人为控制容易忘;
- 构建信息来自版本管理工具,你一提交代码它就变了,写死不严谨;
因此,最好处理方法是将版本信息写在构建脚本中,在构建时,修改版本号文件。然后编译。
这时就需要一个获取版本信息的工具。
我用我最喜欢的C语言实现如下:
#include <stdio.h>
#include <string.h>
int getBuildInfo(const char* cmd)
{
FILE *fstream = NULL;
char buffer[1024];
int res = 0;
memset(buffer,0,sizeof(buffer));
if (NULL == (fstream = popen(cmd,"r")))
{
return -1;
}
fgets(buffer, sizeof(buffer), fstream);
pclose(fstream);
sscanf(buffer,"%d",&res);
return res;
}
int main(int argc, char *argv[])
{
FILE *fp = NULL;
char* gitcmd="git rev-list --all|wc -l";
char* svncmd="svn info|grep "Last Changed Rev:"|awk -F : '{print $2}'|sed 's/ //g'";
int res = 0;
char buffer[2048];
memset(buffer,0,sizeof(buffer));
if (argc < 4) {
printf("Usage:./getversion [NAME] [VERSION] [git/svn/other]
");
return 1;
}
if (strcmp(argv[3],"git") == 0){
res = getBuildInfo(gitcmd);
}else if (strcmp(argv[3],"svn") == 0){
res = getBuildInfo(svncmd);
}else{
res = 58;
}
char* arr="#ifndef __VER_H_FILE__
#define __VER_H_FILE__
#define ___MODULE___ "%s"
#define ___VERSION___ "%s"
#define ___BUILD___ "%d"
#endif";
sprintf(buffer,arr,argv[1],argv[2],res);
fp = fopen("verion.h", "w+");
fprintf(fp, "%s",buffer);
fclose(fp);
return 0;
}
执行:
./getVersionInfo foo v1.1.1 git
然后自己代码把version.h作为头文件进行编译,这样就可以让编译信息与代码信息一致了。