我们已经使用过" Ident" CVS中的工具通过RCS关键字获取一些信息,例如" ID"和"日期"来自我们的源代码。我们可以通过在文本文件中插入关键字$ Id $和$ Date $来做到这一点,好的事情是我们编译程序时可以通过Ident工具从二进制文件中获取相同的信息:
$ ident a.out
现在,我们正在使用SVN。它仍然可以通过具有更好功能的svn属性来完成。唯一的问题是我们只在文本文件中获取此信息,但我们还需要以某种方式从二进制编译文件中获取它们,如上面的Ident。
知道如何从二进制文件中获取它们?
答案 0 :(得分:1)
Subversion,当设置关键字时,将创建相同的ID类型字符串。关键字未在二进制程序中设置,因为这会损害二进制程序。相反,您在源代码中使用类似的版本信息创建字符串变量:
VERSION_STRING = "$Id$";
当Subversion执行结帐时,它会将其扩展为:
VERSION_STRING = "$Id: foo.blah 12338 2014/06/12 02:11:38 bsmith $";
由于这是一个变量,它将保留在二进制代码中,ident
程序应该能够找到它。
确保在此源文件上设置了Subversion属性svn:keywords。否则,Subversion不会扩展关键字。
而不是为什么你不应该使用关键字扩展......
关键字扩展是一个从更原始的修订控制系统开始的概念。这是一种跟踪修订的方法,因为working directory
的概念不存在。最后,关键词最终不仅仅是一种痛苦,而是它的价值。有趣的是,放弃自动关键字的第一个版本控制系统是基于RCS的CVS。 CVS是第一个创建工作目录的版本控制系统,而不是逐个版本化的单个文件。
一个程序不是一个或两个文件,它可能是几十个 - 也就是几百个。如果我有一个放置$Id$
关键字的文件,则显示的版本信息就是该文件的版本信息。如果我不修改该文件,那么每个版本中的版本信息都是相同的。解决这个问题的一种方法是将关键字放在每个文件中:
$ ident /bin/ksh | wc -l
58
我的/bin/ksh
文件中有57个单独的关键字。现在,我所要做的就是查看每个单独的ID,并推断出我实际拥有的Kornshell版本。
或者我可以这样做:
$ ksh --version
version sh (AT&T Research) 93u 2011-02-08
啊,现在我知道要检查的代码版本。它可能用93u 2011-02-08
标记(好吧,不是因为CVS和RCS不允许带空格的标签,或者从数字开始。但是,我应该很容易将它转换为特定的CVS / RCS标签)。使用CVS,我可以查看日志信息并查看发生了哪些更改。某个错误得到修复吗?是否添加了特定功能?是谁改变了代码?
要创建此信息,构建系统使用某种方法在签出时使用此信息修改源文件。您甚至不必提交更改。事实上,实际上最好不要这样做。我的来源看起来像这样:
VERSION = "$Id: %VERSION% $";
并通过构建系统将%VERSION%
替换为我想要的%VERSION%
。甚至像PHP或JavaScript版本这样的非编译代码也可以从中受益。将此与可以运行单元测试的Jenkins CI系统相结合,并在代码中的每次更改时打包软件,并且您可以自动将其包含在实际版本中。
我们是一家Java商店,因此我们将这些信息嵌入:
<copy file="${version.file}"
tofile="${actual.version.file}">
<filterset>
<filter token="VERSION" value="${env.JENKINS_JOB} Build #${env.BUILD_NUMBER}"/>
</filterset>
</copy>
Jenkins将使用Jenkins作业名称和内部版本号替换该字符串。由于我们基于Jenkins作业和内部版本号发布了我们的软件,因此我们可以通过这种方式跟踪我们的更改。
想象一下,如果此更改产生了这样的编译字符串:
$Id: Project-trunk Build #343 $
ident
命令可以选择这个。这个版本与一组特定的Subversion版本(甚至可能是Subversion标签)有关,通过使用Subversion,我可以看到做了哪些更改,以及是否将其集成到问题跟踪系统中。事实上,为什么你要这样做,为什么不设置它以便SCCS的`什么命令也可以拿起它:
$Id: @(#) Project-trunk Build #343 < $
what command picks up the
@(#)string and prints out the entire string until it runs into a NULL character, a _NL_ character, or the
&lt;`。
$ what program.exe
/opt/bin/program.ext
Project-trunk Build #343
$ ident program.exe
/opt/bin/program.exe
$Id: @(#) Project-trunk Build #343 < $