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

时间:2012-01-29 16:27:18

标签: c# java c++ git svn

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

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

有哪些工具可以自动化方式实现这一目标?

我正在使用Eclipse-CDT for C ++(Linux,SVN),但我也对git解决方案以及用Java和C#编写的源代码感兴趣。

3 个答案:

答案 0 :(得分:3)

通过使用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;
}

答案 1 :(得分:2)

 /// <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以后,我没有显示扩展的片段。

答案 2 :(得分:1)

如果你正在使用Makefile和SVN,你可以为C或C ++做这样的事情:

REVISION=$(shell svnversion)
CFLAGS=... -D__REVISION__=\"$REVISION\"

我对CDT并不熟悉,但据我所知,它能够使用基于Makefile的构建系统。