正在从已部署的应用程序检索上次提交ID/修订号

本文关键字:ID 提交 检索 部署 应用程序 | 更新日期: 2023-09-27 18:21:40

我想要一个函数,返回构建部署的应用程序/库的源的最后修订版/提交ID。

我一直在C++中使用__DATE____TIME__宏,但这种方法有明显的缺点。

有哪些工具可以以自动化的方式实现这一点

我使用的是用于C++(Linux、SVN)的EclipseCDT,但我也对git解决方案以及用Java和C#编写的源代码感兴趣。

正在从已部署的应用程序检索上次提交ID/修订号

通过使用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的构建系统。