Версия SVN Revision в сборке .NET без CC.NET

Есть ли способ включить номер версии репозитория SVN в строку версии сборки .NET? Что-то вроде Major.Minor.SVNRev

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

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

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

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

Ответов (8)

Решение

Взгляните на SubWCRev - http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-subwcrev.html

Номера версий сборки обычно находятся в файле assemblyinfo.cs.

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

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

В другом ответе упоминалось, что номер версии 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/

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

Пример :

  1. Скопируйте AssemblyInfo.cs в AssemblyInfoTemplate.cs в папке Properties проекта .
  2. Измените действие сборки на Нет для AssemblyInfoTemplate.cs.
  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. Добавьте следующее событие Pre-build в свойства файла проекта:

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

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

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

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

  1. В настоящее время используют AssemblyInfo.cst , а не AssemblyInfoTemplate.cs, потому что он не будет автоматически Сложение Действие опции 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 будет истинным. Это, по-видимому, вызвано тем фактом, что зафиксированные файлы повторно проверяются после фиксации, а другие файлы - нет.

  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$;
}

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

Если вы хотите обновить номер версии в проекте AssemblyInfo.cs, вам может быть интересна эта статья:

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

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

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

'$ Автор: $
' $ Id: $
'$ Rev: $

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

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

Прочтите / просмотрите эти документы:

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

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

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

Компиляция приложений с пользовательскими задачами для Microsoft Build Engine

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

Напишите свою задачу для получения ревизии из репозитория с помощью 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.

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

Вы можете использовать общий файл версии сборки, на который можно ссылаться во всех своих проектах.

Это делает UppercuT - http://ferventcoder.com/archive/2009/05/21/uppercut---automated-builds---versionbuilder.aspx

Это даст вам представление о том, что вы можете сделать, чтобы получить версии в своих сборках.