正在从已部署的应用程序检索上次提交ID/修订号
本文关键字:ID 提交 检索 部署 应用程序 | 更新日期: 2023-09-27 18:21:40
我想要一个函数,返回构建部署的应用程序/库的源的最后修订版/提交ID。
我一直在C++中使用__DATE__
和__TIME__
宏,但这种方法有明显的缺点。
有哪些工具可以以自动化的方式实现这一点
我使用的是用于C++(Linux、SVN)的EclipseCDT,但我也对git解决方案以及用Java和C#编写的源代码感兴趣。
通过使用Visual Studio和C#,您可以在预构建步骤中使用模板文件调用SubWCRev
命令,该模板文件将被复制到解决方案中使用的文件中。
预构建步骤中的命令是:
<PreBuildEvent>SubWCRev "$(ProjectDir)'" "$(ProjectDir)VersionProvider.template.cs" "$(ProjectDir)VersionProvider.cs"</PreBuildEvent>
在项目中添加以下两个文件:
<Compile Include="VersionProvider.cs">
<DependentUpon>VersionProvider.template.cs</DependentUpon>
</Compile>
<None Include="VersionProvider.template.cs" />
此内容:
internal static class VersionProvider
{
/// <summary>
/// Provides the current subversion revision number
/// </summary>
internal const string CurrentSVNRevision = "$WCREV$";
}
最后但并非最不重要的是,在AssemblyInfo.cs中添加以下行:
[assembly: AssemblyInformationalVersion(VersionProvider.CurrentSVNRevision)]
通过这种方式,项目将自动获取该项目文件夹的当前subversion修订号,并将其烘焙到应用程序的版本信息中,该信息可以在文件属性的详细信息页面上看到。
您也可以在运行时通过代码检索这些信息:
private string GetAdditionalVersionInfo()
{
var assembly = Assembly.GetEntryAssembly();
var attributesFound = assembly.GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), true);
var version = attributesFound.OfType<AssemblyInformationalVersionAttribute>().FirstOrDefault();
return version != null ? version.InformationalVersion : String.Empty;
}
/// <summary>
/// Gets the SVN date.
/// </summary>
/// <value>The SVN date. value</value>
// ReSharper disable UnusedMember.Global
public static new string SvnDate{
// ReSharper restore UnusedMember.Global
get {
const string S = "$Date$";
return S.Substring(7, 19);
}
}
/// <summary>
/// Gets the SVN ID.
/// </summary>
/// <value>The SVN ID. value</value>
// ReSharper disable UnusedMember.Global
public static new string SvnID{
// ReSharper restore UnusedMember.Global
get{
const string S = "$Id$";
const string D = "$";
return S.Replace(D + "Id: ", string.Empty).Replace(" " + D, string.Empty);
}
}
/// <summary>
/// Gets the SVN rev.
/// </summary>
/// <value>The SVN rev. value</value>
// ReSharper disable UnusedMember.Global
// ReSharper disable MemberCanBePrivate.Global
public static new string SvnRev{
// ReSharper restore MemberCanBePrivate.Global
// ReSharper restore UnusedMember.Global
get {
const string S = "$Rev$";
return S.Item(1);
}
}
/// <summary>
/// Gets the SVN author.
/// </summary>
/// <value>The SVN author. value</value>
// ReSharper disable UnusedMember.Global
public static new string SvnAuthor{
// ReSharper restore UnusedMember.Global
get {
const string S = "$Author$";
return S.Item(1);
}
}
注意S.Item(n)返回一个以空格分隔的、从零开始的项。替换为您自己的代码。此外,new只是处理继承的必要条件。必须在svn中设置道具。由于我现在在Mercurial上,所以我没有显示资料片的片段。
如果您使用Makefile和SVN,您可以对C或C++执行以下操作:
REVISION=$(shell svnversion)
CFLAGS=... -D__REVISION__='"$REVISION'"
我对CDT不太熟悉,但我知道它可以使用基于Makefile的构建系统。