我希望有一个函数返回构建已部署应用程序/库的源的最后一个修订版/提交ID。
我一直在使用C ++中的__DATE__
和__TIME__
宏,但这种方法有明显的缺点。
有哪些工具可以自动化方式实现这一目标?
我正在使用Eclipse-CDT for C ++(Linux,SVN),但我也对git解决方案以及用Java和C#编写的源代码感兴趣。
答案 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的构建系统。