Si usa la compilación automática, la información de la versión es un dolor de cabeza.
La información de la versión debe incluir los siguientes tres aspectos:
模块名称:foo
版本号:v1.1.1
构建信息: 132
La información de compilación suele ser el número de registros en git / svn, lo que puede garantizar la versión correcta al buscar el error;
escribir la información de la versión en el código puede causar los siguientes problemas:
- El número de versión en el programa y el número de versión empaquetado no son correctos por un momento de error;
- No siempre que necesite modificar el número de versión, es fácil de olvidar por control humano;
- La información de compilación proviene de la herramienta de administración de versiones, cambia tan pronto como envía el código y la escritura no es rigurosa;
Por lo tanto, la mejor solución es escribir la información de la versión en el script de compilación y modificar el archivo de número de versión durante la compilación. Luego compila.
En este momento, necesita una herramienta para obtener información sobre la versión.
Uso mi lenguaje C favorito para lograr lo siguiente:
#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;
}
Implementación
./getVersionInfo foo v1.1.1 git
Luego compile version.h como un archivo de encabezado en su propio código, de modo que la información de compilación sea coherente con la información del código.