使用Scons进行版本管理的最佳实践是什么?

6

我希望我的Qt/C++应用程序能够知道它的版本。它不应该从某些配置文件中获取版本信息,而是应该在应用程序二进制文件中编译版本号。版本本身是一个字符串,如“X.Y.Z”,其中X是主要版本号,Y是次要版本号,Z是SVN下的修订版本(或者是版本“X.Y.0”发布时的修订版本号与SVN下的修订版本号之差)。你认为使用scons实现这个功能的最简单方法是什么?


1
如果版本号的唯一目的是向用户显示某些内容,则字符串就可以了。如果有任何程序化访问,您将想要将每个版本组件放在单独的字段中(请参见https://dev59.com/XUvSa4cB1Zd3GeqPg8BG#2195824)。另外,为了方便自动化版本增量(例如发布构建脚本),将版本分隔为字段是一个优势。 - Dave Bacher
2个回答

9
SCons有SubstfileTextfile构建器用于生成文件。因此,创建一个函数来计算版本(使用pysvn或调用svn命令),并使用Substfile(从文件中获取模板)或Textfile(只写入提供的内容)将其输出写入文件。然后将该文件与应用程序的其他部分进行编译和链接。
该文件应该是一个源文件(而不是头文件),其内容类似于(假设为C/C ++,但是同样的技术也适用于任何语言):
char *VERSION = "X.Y.Z";

(和其他任何你想要的备选格式)并声明
extern char *VERSION;

如果只更改了一个文件,那么只有这个文件会被重新编译并且应用程序会被重新链接(因为其他源文件可能也发生了变化)。


1
将版本值放在源文件中是一个好主意。我发现制作一个头文件(不需要修改)并为1.版本字符串和2.版本结构创建访问器函数非常有用,其中包含主要、次要等值的单独字段。 - Dave Bacher
谢谢你的回答,我会采用这个方案。很抱歉我反应这么慢。 - Septagram
这非常有帮助,但我认为如何计算/检索版本的部分缺失了。根据OP,Z可以从svn中计算出来,但X.Y从哪里来呢?我猜它们应该以某种方式出现在分支/标记名称中? - davka

1

以下是来自[scons-users]邮件列表的更多答案。

Brian Cody:

我们传递给scons的一个命令行选项是SVN版本库的版本号。然后,我们将此数字放入一个定义中(-DREP_NUM=\"123\"),并在我们的C++代码中构建使用此数字的字符串。这是针对我们的服务器运行构建的。对于本地构建,我们实际上使用用户名而不是版本号,因为某人的版本XYZ的本地构建不一定等于其他人的XYZ(在Windows中,环境变量USERNAME包含已登录用户)。另一个考虑因素是,在scons中更改编译语句的任何部分都意味着目标自动过期。为了解决这个问题,我们的构建系统挑选出实际关心标志的一个对象目标,并且只将标志传递给该对象的编译。

祝你好运

Gary Oberbrunner:

我想让我的Qt/C++应用程序知道它的版本号。这里有一些信息http://www.scons.org/wiki/BuildNumberProcessing可能会有所帮助。
-- Gary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接