关于c ++:自动版本编号

Automatic version numbering

我正在向可执行文件添加一个功能,以使用--version参数运行它。这个项目非常大,使用多个类。我想打印出所有课程的版本。

现在,我的每个类都有一个函数static void print_info() { cout <<"information here" << endl; },带有main()的文件调用每个类的print_info

问题:有没有一种方法可以通过更改自动维护版本号?

其他信息:我和我的团队使用NetBeans进行开发。我们也使用Subversion(SVN),我知道它保留修订号。问题仅与版本号相切相关。我希望能够分发一个可执行文件,它将在不访问Subversion服务器的情况下打印版本号。

如果这有点含糊,我很乐意提供更多的信息。谢谢!

附笔。我不在乎版本值是多少。天气是由netbeans生成的任意数字,或者是相应的子版本号,或者只是最后一次修改的日期。


您可以在源文件上使用Subversion Revision属性,该属性在文件中激活$Revision$关键字替换。

1
string version ="$Revision:$";

http://svnbook.red-bean.com/en/1.4/svn.advanced.props.special.keywords.html


首先,我建议您做一些其他的事情,而不是您的print_info()方法,因为它不是非常灵活-如果您想实际使用版本而不是简单地将其打印到stdout,或者如果您想在错误消息中向stderr报告版本呢?返回const char字符串的static方法将更加通用。

关于版本号的选择,您当然可以使用SVN关键字,这些关键字可以替换到代码体中。例如,如果您有一行

1
char[] versionString ="commit revision $Rev$";

并启用相应的关键字替换svn propset svn:keywords"Rev" file.cpp,下次执行更新时,SVN客户机将更新文本,如下所示

1
char[] versionString ="commit revision $Rev: 12 $";

下次提交时,字符串将被覆盖到新的正确字符串,例如

1
char[] versionString ="commit revision $Rev: 13 $";

如果您很好地使用SVN,那么您应该进行分支和标记,在这种情况下,分支和标记信息(它是$URL$关键字的一部分)是有用的,可以包括在您的版本字符串中。$Revision$还可用于为您提供在更新之间更改的值。不过,请记住,只有在执行更新(签出、提交等)时才会更新关键字。如果您对代码进行了更改,然后编译它,那么报告的$Revision$将与您最初签出代码时相同。据我所知,避免被这种情况困扰的唯一方法是采用在编译新版本的软件之前执行代码提交的过程-如果将它与SVN中的标记发布过程结合起来,这会很好地工作。


如果你想这样做,我会在每一个源文件的请求下使用#define,并用一个文件的最后修改日期更新它(要么使用$date:,要么用你自己的脚本更新它)。然后您可以非常容易地使用print_info()中定义的常量。