Извлечение идентификатора последнего номера / номера редакции из развернутого приложения - PullRequest
2 голосов
/ 29 января 2012

Я хотел бы иметь функцию, возвращающую идентификатор последней редакции / фиксации источника, из которого было создано развернутое приложение / библиотека.

Я использовал макросы __DATE__ и __TIME__ в C ++, но у этого подхода есть очевидные недостатки.

Какие инструменты доступны для достижения этой цели в автоматическом режиме?

Я использую Eclipse-CDT для C ++ (Linux, SVN), но я также заинтересован в git-решениях и источниках, написанных на Java и C #.

Ответы [ 3 ]

3 голосов
/ 31 января 2012

Используя Visual Studio и C #, вы можете на этапе Pre-Built вызвать команду 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;
}
2 голосов
/ 29 января 2012
 /// <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) возвращает разделенный пробелами элемент на основе нуля.Замените своим собственным кодом.Также новое необходимо только для борьбы с наследованием.Реквизит должен быть установлен в SVN.У меня нет фрагмента, показывающего расширения, так как я сейчас на Mercurial.

1 голос
/ 29 января 2012

Если вы работали с Makefile и SVN, вы могли бы сделать что-то подобное для C или C ++:

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

Я не очень знаком с CDT, но я понимаю, что он может использовать систему сборки на основе Makefile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...