关于自动构建代码与版本号的问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

关于⾃动构建代码与版本号的问题
如果⽤⾃动构建,版本信息是⼀个让⼈头疼的问题。

版本信息应该包含以下三个⽅⾯:
模块名称:foo
版本号:v1.1.1
构建信息: 132
构建信息通常是git/svn中的记录数,这样可以保证找BUG的时候能对的上版本;
版本信息写死在代码⾥可能引发如下问题:
1. 程序中的版本号和打包的版本号⼀时⼿误就对不上了;
2. 并⾮每次提交都需要修改版本号,⼈为控制容易忘;
3. 构建信息来⾃版本管理⼯具,你⼀提交代码它就变了,写死不严谨;
因此,最好处理⽅法是将版本信息写在构建脚本中,在构建时,修改版本号⽂件。

然后编译。

这时就需要⼀个获取版本信息的⼯具。

我⽤我最喜欢的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]\n");
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__\
\r\n#define __VER_H_FILE__\
\r\n\
\r\n#define ___MODULE___ \"%s\"\
\r\n#define ___VERSION___ \"%s\"\
\r\n#define ___BUILD___ \"%d\"\
\r\n\
#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作为头⽂件进⾏编译,这样就可以让编译信息与代码信息⼀致了。

相关文档
最新文档