Есть ли способ включить номер редакции репозитория SVN в строку версии сборки .NET? Что-то вроде Major.Minor.SVNRev
Я видел упоминание о том, чтобы сделать это с чем-то вроде CC.NET (хотя на самом деле на ASP.NET), но есть ли способ сделать это без какого-либо дополнительного программного обеспечения? Я делал подобные вещи в C / C ++ до использования пакетных сценариев сборки, но это было достигнуто путем чтения номера версии, а затем с помощью сценария каждый раз записывать файл с именем «ver.h», что-то с эффектом:
#define MAJORVER 4
#define MINORVER 23
#define SOURCEVER 965
Затем мы будем использовать эти определения для генерации строки версии.
Возможно ли что-то подобное для .NET?
Посмотрите на SubWCRev - http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-subwcrev.html
Номера версий сборки обычно находятся в assemblyinfo.cs
svn info, сообщает вам версию, в которой вы находитесь, вы можете сделать событие "pre-build" в VS для вашего проекта, чтобы сгенерировать assemblyinfo.cs, запустив svn info и проанализировав его результаты с помощью собственного приложения для командной строки.
Я делал это раньше, но быстро переключился на то, чтобы ccnet передавал его как переменную nant.
Если вы хотите обновить номер версии в проектах 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
Упомянутая в третьем справочнике 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.
Это возможно, но не следует: компоненты строки версии сборки ограничены 16-разрядными числами (максимум 65535). Номера версий Subversion могут легко стать больше, поэтому в какой-то момент компилятор вдруг начнет жаловаться.
major.minor
вносятся изменения. Это еще одна вещь для поддержания. Когда у вас есть репозитории с десятками тысяч ревизий, как в нашем случае, когнитивная нагрузка является проблемой. Вы можете использовать общий файл версии сборки, который вы можете использовать во всех своих проектах.
UppercuT делает это - http://ferventcoder.com/archive/2009/05/21/uppercut---automated-builds---versionbuilder.aspx
Это даст вам представление о том, что вы можете сделать, чтобы получить версии в ваших сборках.
В другом ответе упоминалось, что номер редакции SVN может не быть хорошей идеей из-за ограничения размера номера.
Следующая ссылка содержит не только номер редакции SNV, но также шаблон информации о версии даты.
Добавить это в проект .NET очень просто - нужно сделать очень мало.
Вот проект GitHub, который обращается к этому https://github.com/AndrewFreemantle/When-The-Version/downloads
Следующий URL-адрес может загружаться медленно, но это пошаговое объяснение того, как сделать эту работу (простой и короткий 3 или 4 шага)
Вот пример C # для автоматического обновления информации о ревизии в сборке. Это основано на ответе Уилла Дина, который не очень сложен.
Пример :
- Скопируйте 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. Сборка будет завершена, но свойство File Version в фактической сборке будет AssemblyFileVersion по модулю 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.