我正在为我的可执行文件添加一个功能,以使用--version参数运行它。该项目非常大,使用多个类。我想打印出所有类的版本。
现在我的每个类都有一个函数static void print_info() { cout << "information here" << endl; }
,每个类的main()调用print_info
。
问题:有没有办法通过更改自动维护版本号?
其他信息: 我和我的团队使用NetBeans进行开发。我们也使用Subversion(svn),我知道它保留了版本号。问题仅与修订号密切相关。我希望能够分发一个可执行文件,打印版本号而无需访问subversion服务器。
如果这有点模糊,我会很乐意提供更多信息。 谢谢!
P.S。 我不关心版本值是什么。 Weather是NetBeans生成的任意数字,或相应的subversion版本号,或者仅是上次修改的日期。
答案 0 :(得分:3)
您可以在源文件上使用subversion Revision
属性,以激活文件中的$Revision$
关键字替换。
string version = "$Revision:$";
http://svnbook.red-bean.com/en/1.4/svn.advanced.props.special.keywords.html
答案 1 :(得分:1)
首先,我建议您执行除print_info()
方法之外的其他操作,因为它不是非常灵活 - 如果您想要实际使用版本而不是简单地将其打印到STDOUT,或者如果您希望向STDERR报告错误消息中的版本?返回const char字符串的static
方法将更加通用。
关于版本号的选择,您当然可以使用SVN关键字,它们可以substituted到您的代码正文中。例如(在提供的链接中给出的示例之一),如果您有行
char[] versionString = "commit revision $Rev$";
并启用相应的关键字替换svn propset svn:keywords "Rev" file.cpp
,下次执行更新时,SVN客户端会将文本更新为
char[] versionString = "commit revision $Rev: 12 $";
并在下次提交时,字符串将被覆盖为新的正确字符串,例如
char[] versionString = "commit revision $Rev: 13 $";
如果您使用SVN,则应该进行分支和标记,在这种情况下,分支和标记信息(构成$URL$
关键字的一部分)是包含在版本字符串中的有用信息。 $Revision$
对于为您提供更新之间更改的值也很有用。但请记住,只有在执行更新(结帐,提交等)时才会更新关键字。如果您对代码进行了更改然后进行编译,则报告的$Revision$
将与您最初检出代码时的相同。据我所知,避免被这个问题搞定的唯一方法是在编译软件的新版本之前采用执行代码提交的过程 - 如果将它与标记版本的过程结合使用,这种方法很有效在SVN内。
答案 2 :(得分:0)
如果您想这样做,我会在每个源文件的乞讨处找到#define
,并使用文件的最后修改日期更新它(使用$ Date:$或更新此用你自己的脚本)。然后,您可以非常轻松地在print_info()中使用已定义的常量。