Ответ 1
Взгляните на SubWCRev - http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-subwcrev.html
Номера версий сборки обычно находятся в файле assemblyinfo.cs
Можно ли включить номер версии репозитория SVN в строку версии сборки .NET? Что-то вроде Major.Minor.SVNRev
Я видел упоминание об этом с чем-то вроде CC.NET(хотя на самом деле ASP.NET), но есть ли способ сделать это без какого-либо дополнительного программного обеспечения? Я делал подобные вещи в C/С++ перед использованием скриптов пакетной сборки, но в результате был выполнен считывание номера версии, после чего script каждый раз выписывал файл, называемый "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
Здесь и пример С# для автоматического обновления информации о ревизии в сборке. Он основан на ответе Уилла Дина, который не очень сложный.
Пример:
Измените строку с помощью 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:
#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 будет истинным. Это, по-видимому, вызвано тем фактом, что переданные файлы повторно в главной версии после фиксации, но другие файлы не являются.
Добавление Чтобы ответить на комментарий @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 и номер сборки в файл сборки С#.
Компиляция приложений с пользовательскими задачами для 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.
В другом ответе упоминалось, что номер версии SVN может не быть хорошей идеей из-за ограничения на размер числа.
Следующая ссылка содержит не только номер версии SNV, но и шаблон информации о версии даты.
Добавление этого в .NET-проект прост - очень мало работы нужно сделать.
Вот проект github, который обращается к этому https://github.com/AndrewFreemantle/When-The-Version/downloads
Следующий URL-адрес может загружаться медленно, но поэтапное объяснение того, как сделать эту работу (простой и короткий 3 или 4 шага)
svn info, сообщает вам версию, в которой вы находитесь, вы можете сделать событие "pre-build" в VS на вашем проекте, чтобы сгенерировать сборкуinfo.cs, запустив svn-информацию и проанализировав ее результаты с помощью приложения командной строки для дома.
Я сделал это раньше, но быстро переключился на простое 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 $
Вы можете использовать файл общей версии сборки, который вы можете использовать во всех своих проектах.
UppercuT делает это - http://ferventcoder.com/archive/2009/05/21/uppercut---automated-builds---versionbuilder.aspx
Это даст вам представление о том, что вы можете сделать, чтобы получить версии в своих сборках.