Подтвердить что ты не робот

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

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

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

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

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

Возможно ли это для .NET?

4b9b3361

Ответ 2

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

Пример:

  • Скопируйте AssemblyInfo.cs в AssemblyInfoTemplate.cs в Свойства папки.
  • Измените действие сборки на None для AssemblyInfoTemplate.cs.
  • Измените строку с помощью AssemblyFileVersion на:

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

  • Рассмотрим добавление:

    [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:$.")],

    который даст подробные сведения о состоянии ревизии источника, из которого была собрана сборка.

  • Добавьте следующие свойства Pre-build в свойства файла проекта:

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

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

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

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

  • Теперь он использует AssemblyInfo.cst, а не AssemblyInfoTemplate.cs, потому что у него автоматически будет опция Build Action None, и она не будет загромождать вас списком ошибок, но вы потеряете подсветку синтаксиса.
  • Я добавил два теста в мои файлы 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 будет истинным. Это, по-видимому, вызвано тем фактом, что переданные файлы повторно в главной версии после фиксации, но другие файлы не являются.

  • У меня возникли сомнения в том, что первый параметр 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.

Ответ 3

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

Ответ 4

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

Доступ к репозиторию Subversion из .NET с использованием DotSVN

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

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

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

MSVuildCommunityTasks svnversion, упомянутая в третьей ссылке, не будет работать с svn на Mac 10.5.6 и VS2008 С# в сборке проекта внутри 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.

Ответ 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

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

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

Ответ 7

Если вы хотите обновить номер версии в проектах 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 $

Ответ 8

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

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

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