Версия редакции SVN в сборке .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?

15.08.2008 12:15:31
Stackoverflow показывает номер ревизии в нижнем колонтитуле, может, Джефф расскажет нам, как он это сделал.
Jedi Master Spooky 15.08.2008 12:43:21
Это отлично - и дата, и номер версии svn fatlemon.co.uk/2011/11/…
Tim 10.02.2012 19:29:23
посмотрите мой ответ - есть проект GitHub, который делает то же самое
Tim 10.02.2012 19:36:23
Ссылка выше может не загружаться правильно. URL GitHub в моем ответе ниже. - Для решения, которое использует дату И номер SVN Rev.
Tim 11.02.2012 03:06:39
8 ОТВЕТОВ
РЕШЕНИЕ

Посмотрите на SubWCRev - http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-subwcrev.html

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

6
15.08.2008 12:29:04
Я добавил пример реализации в качестве нового ответа.
R. Schreurs 7.01.2013 12:03:33

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

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

2
15.08.2008 13:51:52

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

2
12.09.2008 05:48:31
из этой статьи: «Ограничение использования ключевого слова $ Rev $ состоит в том, что оно дает вам только ревизию файла, а не весь проект, поэтому использование ключевого слова $ rev $ не может работать как часть управления версиями моего программного обеспечения». так что вам придется редактировать / фиксировать файл Assembly.cs для каждой ревизии, чтобы поддерживать его в актуальном состоянии?
Lucas 30.05.2009 05:40:52

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

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

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

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

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

Упомянутая в третьем справочнике MSBuildCommunityTasks svnversion не будет работать с svn на Mac 10.5.6 и сборкой проекта C # 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
17.03.2009 08:21:08
К сожалению, dotSVN больше не поддерживается, и одной из вещей, которые были оставлены, были репозитории на http.
Martin 2.06.2010 09:50:28

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

10
17.03.2009 13:51:17
Хорошая точка зрения. При 20 коммитах в день это будет продолжаться в течение 8 лет. 100 коммитов продлятся менее 2 лет. Это может быть хорошо для небольших проектов. Конечно, не хорошо для больших.
Tim 10.02.2012 19:39:02
@Tim, только если участники проекта работают полный рабочий день 7 дней в неделю :-) При условии 5-дневной рабочей недели, оценки составляют 13 и 2,6 года соответственно. Для первого случая разница может быть значительной.
Péter Török 20.06.2012 08:41:43
Кроме того, вам следует изменять версию сборки только в том случае, если она нарушает совместимость с предыдущей версией - не следует помещать информацию о версии сборки в версию сборки. Информация о версии сборки может и должна быть помещена в AssemblyFileVersion, которая поддерживает 32-битные числа. См. Stackoverflow.com/questions/64602 .
Darryl 1.11.2012 16:58:55
-1, это не очень хорошая причина. 65536 коммитов не является практическим ограничением для большинства продуктов. И даже для продуктов, которые превышают это число, major-minor-rev должен предоставлять достаточно контекста, чтобы «развернуть» ревизию до нужного значения (у вас, конечно, не будет 64k ​​коммитов для каждой ревизии вашего приложения, если вы версионирование разумно).
soupdog 13.12.2013 22:04:13
@soupdog: Ваше предложение «развернуть» ревизию - это то, что я считаю сам. Это немного усложняет ситуацию, так как вам нужно выбрать смещение, чтобы вычесть ревизию, и не забывать проверять, нужно ли обновлять смещение каждый раз, когда major.minorвносятся изменения. Это еще одна вещь для поддержания. Когда у вас есть репозитории с десятками тысяч ревизий, как в нашем случае, когнитивная нагрузка является проблемой.
Wim Coenen 14.12.2013 13:43:19

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

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

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

0
8.06.2009 16:34:24

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

4
11.02.2012 03:00:22
Это решение быстрое и эффективное
Simon F 2.12.2015 16:59:03

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

Пример :

  1. Скопируйте AssemblyInfo.cs в AssemblyInfoTemplate.cs в папке свойств проекта .
  2. Измените действие сборки на None для 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 $ примет значение true. 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, потому что он автоматически будет иметь опцию 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 будет истинным. Похоже, это связано с тем, что переданные файлы пересматриваются после подтверждения, а другие файлы - нет.

  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.

30
22.09.2017 11:02:49
Согласитесь, это правильный ответ, а не просто ссылка на информацию об инструменте, который можно использовать.
soupdog 13.12.2013 21:59:01
Можете ли вы разработать эту вторую часть? Я не совсем понимаю это. Вы переименовали AssemblyInfo.cs в AssemblyInfo.cst? Или? Что происходит с шаблоном? Где вы добавили эти новые тесты? В какой части файла? Отличный ответ, кстати!
100r 2.02.2014 22:27:38
@ 100r, я исправил имена файлов, которые я записал неправильно. Я надеюсь, что это решит вашу путаницу. Если нет, пожалуйста, дайте мне знать.
R. Schreurs 4.02.2014 10:25:50
Это выглядит действительно хорошо, но как бы вы распечатали это на странице ASP? т.е.: <% $ Свойства: AssemblyVersion%>
tommylux 22.09.2017 09:30:07
Похоже, я разобрался с твоим классом. Я думаю, это потому, что я не знал, как работает файл cst. Когда вы помещаете Public Class VersionInfo в cst при сборке, это заполняет файл cs, а затем он становится пригодным для использования в проекте с переведенной информацией о версии из системы управления версиями. Еще раз спасибо.
tommylux 22.09.2017 13:17:52