zoukankan      html  css  js  c++  java
  • 关于自动构建代码与版本号的问题

    如果用自动构建,版本信息是一个让人头疼的问题。
    版本信息应该包含以下三个方面:

    模块名称: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]
    ");
          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作为头文件进行编译,这样就可以让编译信息与代码信息一致了。

  • 相关阅读:
    vim发现交换文件
    Linux vim 一般模式(底线模式) 命令行模式 插入模式 记录2:
    linux的停止命令
    Linux centos7 常用命令 记录1:
    linux操作系统的关机命令
    linux解密shadow_Linux密码文件passwd和shadow分析
    mysql中root用户被忽略?
    Linux笔记01
    重装系统后恢复MySQL服务,Can't create test file C:ProgramDataMySQLMySQL
    重装JDK后,输入java -version报错:could not open " xxxxjvm.cf "
  • 原文地址:https://www.cnblogs.com/bugutian/p/12701092.html
Copyright © 2011-2022 走看看