Версия редакции SVN в сборке .NET без CC.NET

Есть ли способ включить номер редакции репозитория SVN в строку версии .NET-сборки? Что-то вроде майора.Незначительный.Свнрев

Я видел упоминание о том, чтобы сделать это с чем-то вроде CC.NET (хотя на ASP.NET на самом деле), но есть ли способ сделать это без дополнительного программного обеспечения? Я делал подобные вещи в C/C++ перед использованием пакетных сценариев сборки, но это было сделано путем чтения номера версии, а затем сценарий написал файл под названием «ver.h » каждый раз что-то с эффектом:

#define MAJORVER 4
#define MINORVER 23
#define SOURCEVER 965

Затем мы будем использовать эти определения для создания строки версии.

Возможно ли что-то подобное для .NET?

8 ответов

  1. svn info, сообщает вам версию, на которой вы находитесь, вы можете сделать событие «pre-build» в VS на вашем проекте для создания assemblyinfo.cs, запустив svn info и проанализировав его результаты с помощью приложения домашней командной строки.

    Я делал это раньше, но быстро переключился на просто передачу ccnet в качестве переменной nant.

  2. Если требуется обновить номер версии в Project AssemblyInfo.cs вас может заинтересовать эта статья:

    CodeProject: использование номеров версий Subversion в проектах Visual Studio

    Если вы включаете ключевые слова SVN, то каждый раз, когда вы регистрируетесь в проекте Subversion, ваши файлы проверяются на наличие определенных «ключевых слов» и заменяются некоторой информацией.

    Например, в верхней части моих исходных файлов я бы создал заголовок, содержащий следующие ключевые слова:

    Автор:$
    ‘$Id:$
    ‘$Оборот$:

    Когда я проверяю этот файл в Subversion, эти ключевые слова заменяются следующими:

    Автор: paulbetteridge $
    ‘$Id: myfile.vb 145 2008-07-16 15:24: 29Z paulbetteridge $
    ‘$Rev: 145 $

  3. Чтение / просмотр этих документов:

    Доступ к репозиторию Subversion из .NET с помощью DotSVN

    Как написать задачу

    Вставьте версию SVN и номер сборки в файл c# AssemblyInfo

    Компиляция Приложений С Помощью Пользовательских Задач Для Microsoft Build Engine

    MSBuildCommunityTasks svnversion, упомянутый в третьей ссылке, не будет работать с svn на Mac 10.5.6 и VS2008 C# project build внутри Parallels hosting Vista (ie., через ОС).

    Напишите собственную задачу для извлечения редакции из репозитория с помощью DotSVN:

    using System;
    using Microsoft.Build.Framework;
    using Microsoft.Build.Utilities;
    using DotSVN.Common;
    using DotSVN.Common.Entities;
    using DotSVN.Common.Util;
    using DotSVN.Server.RepositoryAccess;
    
    namespace GetSVNVersion
    {
        public class GetRevision : Task
        {
            [Required]
            public string Repository { get; set; }
            [Output]
            public string Revision { get; set; }
    
            public override bool Execute()
            {
                ISVNRepository repo;
                bool connected = true;
                try
                {
                    repo = SVNRepositoryFactory.Create(new SVNURL(Repository));
                    repo.OpenRepository();
                    Revision = repo.GetLatestRevision().ToString();
                    Log.LogCommandLine(Repository + " is revision " + Revision);
                    repo.CloseRepository();
                }
                catch(Exception e)
                {
                    Log.LogError("Error retrieving revision number for " + Repository + ": " + e.Message);
                    connected = false;
                }
                return connected;
            }
        }
    }
    

    Таким образом, путь к репозиторию будет «file:///Y:/repo», где Y: — каталог Mac, сопоставленный с Vista.

  4. Это возможно, но вы не должны: компоненты строки версии сборки ограничены 16-разрядными номерами (max 65535). Номера версий Subversion могут легко стать больше, поэтому в какой-то момент компилятор внезапно начнет жаловаться.

  5. В другом ответе упоминалось, что номер редакции SVN может не быть хорошей идеей из-за ограничения на размер номера.

    Следующая ссылка предоставляет не только номер редакции SNV, но и шаблон информации о версии даты.

    Добавить это в проект .NET просто — очень мало работы нужно сделать.

    Вот проект github, который адресует это
    https://github.com/AndrewFreemantle/When-The-Version/downloads

    Следующий url-адрес может загружаться медленно, но является пошаговым объяснением того, как сделать эту работу (легкие и короткие 3 или 4 шага)

    http://www.fatlemon.co.uk/2011/11/wtv-automatic-date-based-version-numbering-for-net-with-whentheversion/

  6. Вот и пример C# для автоматического обновления информации о ревизии в сборке. Он основан на ответе Уилла Дина, который не очень сложен.

    Образец :

    1. Копировать AssemblyInfo.cs для AssemblyInfoTemplate.cs в проекте
      свойства папки .
    2. Измените действие Build на None для AssemblyInfoTemplate.цезий.
    3. Измените строку с AssemblyFileVersion на:

      [assembly: AssemblyFileVersion("1.0.0.$WCREV$")]

    4. Рассмотреть возможность добавления:

      [assembly: AssemblyInformationalVersion("Build date: $WCNOW=%Y-%m-%d %H:%M:%S$; Revision date: $WCDATE=%Y-%m-%d %H:%M:%S$; Revision(s) in working copy: $WCRANGE$$WCMODS?; WARNING working copy had uncommitted modifications:$.")],

      что даст подробную информацию о состоянии редакции исходного кода сборки.

    5. Добавьте следующее событие предварительной сборки в свойства файла проекта:

      subwcrev "$(SolutionDir)." "$(ProjectDir)Properties\AssemblyInfoTemplate.cs" "$(ProjectDir)Properties\AssemblyInfo.cs" -f

    6. Рассмотрите возможность добавления AssemblyInfo.cs в список игнорирования svn. Подставленные номера редакций и даты изменят файл, что приведет к незначительным изменениям и ревизиям, а $WCMODS$ оценит значение true. AssemblyInfo.КС, конечно, должен быть включен в проект.

    В ответ на возражения Вима Коэнена я заметил, что, в отличие от того, что было предложено Даррилом, AssemblyFileVersion также не поддерживает числа выше 2^16. Сборка будет завершена, но версия файла свойств в фактической сборке будет AssemblyFileVersion по модулю 65536. Таким образом, 1.0.0.65536, а также 1.0.0.131072 даст 1.0.0.0 и т.д. В этом примере в свойстве AssemblyInformationalVersion всегда имеется номер версии true. Вы можете пропустить Шаг 3, если считаете это важной проблемой.

    Edit: некоторые дополнительные сведения после использования этого решения в течение некоторого времени.

    1. Теперь используется AssemblyInfo.cst вместо AssemblyInfoTemplate.cs, потому что он автоматически будет иметь опцию Build Action None, и он не будет загромождать список ошибок, но вы потеряете подсветку синтаксиса.
    2. Я добавил два теста в AssemblyInfo.CST файлы:

      #if(!DEBUG)    
          $WCMODS?#error Working copy has uncommitted modifications, please commit all modifications before creating a release build.:$ 
      #endif 
      #if(!DEBUG)       
          $WCMIXED?#error Working copy has multiple revisions, please update to the latest revision before creating a release build.:$ 
      #endif
      

      Используя это, вам, как правило, придется выполнить полное обновление SVN, после фиксации и до успешного построения выпуска. В противном случае $WCMIXED будет true. Это, по-видимому, вызвано тем, что зафиксированные файлы повторно в Главной редакции после фиксации, а другие файлы нет.

    3. У меня были некоторые сомнения в том, что первый параметр subwcrev, «$(SolutionDir)», который задает область для проверки информации о версии svn, всегда работает так, как требуется. Возможно, это должно быть $(ProjectDir), если вы содержательны, если каждая отдельная сборка находится в согласованной редакции.

    Дополнение
    к ответу на комментарий @tommylux.

    SubWcRev можно использовать для любого файла в проекте. Если требуется отобразить сведения о ревизии на веб-странице, можно использовать этот шаблон VersionInfo:

    public class VersionInfo
    {       
        public const int RevisionNumber = $WCREV$;
        public const string BuildDate = "$WCNOW=%Y-%m-%d %H:%M:%S$";
        public const string RevisionDate = "$WCDATE=%Y-%m-%d %H:%M:%S$";
        public const string RevisionsInWorkingCopy = "$WCRANGE$";
        public const bool UncommitedModification = $WCMODS?true:false$;
    }
    

    Добавьте событие pre-build, подобное событию AssemblyInfo.cst и вы будете иметь легкий доступ ко всей соответствующей информации SubVersion.