Версия версии SVN в сборке .NET без CC.NET
-
08-06-2019 - |
Вопрос
Есть ли способ включить номер версии репозитория 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.
Другие советы
Ниже приведен пример C# для автоматического обновления информации о версии в сборке.Он основан на ответе Уилла Дина, который не очень подробен.
Пример :
- Скопируйте AssemblyInfo.cs в AssemblyInfotemplate.cs в папке проекта Характеристики.
- Изменить Действие сборки к Никто для 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:$.")]
,который предоставит подробную информацию о статусе версии исходного кода, из которого была собрана сборка.
Добавьте следующее событие перед сборкой в свойства файла проекта:
subwcrev "$(SolutionDir)." "$(ProjectDir)Properties\AssemblyInfoTemplate.cs" "$(ProjectDir)Properties\AssemblyInfo.cs" -f
Рассмотрите возможность добавления файла AssemblyInfo.cs в список игнорирования svn.Замененные номера и даты редакций изменят файл, что приведет к незначительным изменениям и версиям, а $WCMODS$ будет оценен как true.Разумеется, файл AssemblyInfo.cs должен быть включен в проект.
В ответ на возражения Вима Коэнена я заметил, что, в отличие от того, что было предложено Дэррилом, AssemblyFileVersion также делает нет поддержка чисел выше 2^16.Строительство будет завершено, но объект недвижимости Версия файла в фактической сборке будет AssemblyFileVersion по модулю 65536.Таким образом, 1.0.0.65536, а также 1.0.0.131072 дадут 1.0.0.0 и т. д.В этом примере в свойстве AssemblyInformationalVersion всегда указан действительный номер редакции.Вы можете пропустить шаг 3, если считаете это серьезной проблемой.
Редактировать:некоторая дополнительная информация после некоторого использования этого решения.
- Теперь он использует AssemblyInfo.cst, а не AssemblyInfoTemplate.cs, поскольку он автоматически будет иметь Действие сборки вариант Никто, и это не будет загромождать ваш список ошибок, но вы потеряете подсветку синтаксиса.
Я добавил два теста в файлы 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.
Это возможно, но не следует:компоненты строки версии сборки ограничены 16-битными числами (максимум 65535).Номера ревизий Subversion могут легко стать больше, поэтому в какой-то момент компилятор внезапно начнет жаловаться.
Прочтите/просмотрите эти документы:
Доступ к репозиторию Subversion из .NET с помощью DotSVN
Вставьте версию SVN и номер сборки в файл C# AssemblyInfo.
Компиляция приложений с настраиваемыми задачами для Microsoft Build Engine
Версия svn MSBuildCommunityTasks, упомянутая в третьей ссылке, не будет работать с 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.
В другом ответе упоминалось, что номер версии SVN может быть не очень хорошей идеей из-за ограничения на размер номера.
По следующей ссылке представлен не только номер версии SNV, но и шаблон информации о дате версии.
Добавить это в проект .NET просто — нужно проделать совсем немного работы.
Вот проект github, который решает эту проблемуhttps://github.com/AndrewFreemantle/When-The-Version/downloads
Следующий URL-адрес может загружаться медленно, но он представляет собой пошаговое объяснение того, как это сделать (простые и короткие 3 или 4 шага).
svn, сообщает вам версию, которую вы используете, вы можете создать событие «предварительной сборки» в VS в своем проекте, чтобы сгенерировать сборкуinfo.cs, запустив svn info и проанализировав ее результаты с помощью домашнего приложения командной строки.
Я делал это раньше, но быстро переключился на то, чтобы ccnet передавал это как переменную в nant.
Если вы хотите обновить номер версии в проекте AssemblyInfo.cs, вас может заинтересовать эта статья:
КодПроект:Используйте номера версий Subversion в своих проектах Visual Studio.
Если вы включите ключевые слова SVN, то каждый раз, когда вы регистрируете проект, Subversion сканирует ваши файлы на наличие определенных «ключевых слов» и заменяет ключевые слова некоторой информацией.
Например, в верхней части исходных файлов я бы создал заголовок, содержащий следующие ключевые слова:
'$Автор:$
'$Идентификатор:$
'$Реверс:$Когда я проверяю этот файл в Subversion, эти ключевые слова заменяются следующими:
'$Автор:Полбеттеридж $
'$Идентификатор:myfile.vb 145 16 июля 2008 г. 15:24:29Z paulbetteridge $
'$Реверс:145 $
Вы можете использовать общий файл версии сборки, на который вы можете ссылаться во всех своих проектах.
Апперкот Означает ли это - http://ferventcoder.com/archive/2009/05/21/uppercut---automated-builds---versionbuilder.aspx
Это даст вам представление о том, что можно сделать, чтобы получить версии в сборках.