C# 从部署的应用程序中检索上次提交ID/修订号
我希望有一个函数返回构建已部署应用程序/库的源的最后一次修订/提交ID < >我使用C++中的C# 从部署的应用程序中检索上次提交ID/修订号,c#,java,c++,git,svn,C#,Java,C++,Git,Svn,我希望有一个函数返回构建已部署应用程序/库的源的最后一次修订/提交ID < >我使用C++中的
我使用Eclipse CDT作为C++(Linux,Svn),但它也对Git解决方案感兴趣,并且在爪哇和C语言编写的源代码。
< P>如果你使用MaFe文件和Svn,你可以为C或C++做这样的事情:REVISION=$(shell svnversion)
CFLAGS=... -D__REVISION__=\"$REVISION\"
我不太熟悉CDT,但我知道它能够使用基于Makefile的构建系统。//
/// <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);
}
}
///获取SVN日期。
///
///SVN日期。价值
//ReSharper禁用UnusedMember.Global
公共静态新字符串SvnDate{
//ReSharper还原未使用的成员。全局
得到{
常量字符串S=“$Date$”;
返回S.子串(7,19);
}
}
///
///获取SVN ID。
///
///SVN ID.值
//ReSharper禁用UnusedMember.Global
公共静态新字符串SvnID{
//ReSharper还原未使用的成员。全局
得到{
常量字符串S=“$Id$”;
常量字符串D=“$”;
返回S.Replace(D+“Id:”,string.Empty)。Replace(“+D,string.Empty”);
}
}
///
///获取SVN版本。
///
///SVN版本。价值
//ReSharper禁用UnusedMember.Global
//ReSharper disable MemberCanBePrivate.Global
公共静态新字符串SvnRev{
//ReSharper restore MemberCanBePrivate.Global
//ReSharper还原未使用的成员。全局
得到{
常量字符串S=“$Rev$”;
返回第(1)项;
}
}
///
///获取SVN作者。
///
///SVN作者。价值
//ReSharper禁用UnusedMember.Global
公共静态新字符串svnautor{
//ReSharper还原未使用的成员。全局
得到{
常量字符串S=“$Author$”;
返回第(1)项;
}
}
注意:S.Item(n)返回一个以空格分隔的零基项。替换为您自己的代码。而且,新的只在处理继承时才有必要。道具必须在svn中设置。由于我现在使用Mercurial,因此没有显示扩展的代码片段。通过使用Visual Studio和C#您可以在预先构建的步骤中使用模板文件调用命令,该模板文件将复制到解决方案中使用的文件中 预构建步骤中的命令是:
<PreBuildEvent>SubWCRev "$(ProjectDir)\" "$(ProjectDir)VersionProvider.template.cs" "$(ProjectDir)VersionProvider.cs"</PreBuildEvent>
通过这种方式,项目将自动将此项目文件夹的当前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;
}
私有字符串GetAdditionalVersionInfo()
{
var assembly=assembly.GetEntryAssembly();
var attributesFound=assembly.GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute),true);
var version=attributesFound.OfType().FirstOrDefault();
返回版本!=null?版本。信息版本:String.Empty;
}
您知道Git是否也可以做类似的事情吗?
internal static class VersionProvider
{
/// <summary>
/// Provides the current subversion revision number
/// </summary>
internal const string CurrentSVNRevision = "$WCREV$";
}
[assembly: AssemblyInformationalVersion(VersionProvider.CurrentSVNRevision)]
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;
}