Получение номера редакции рабочей копии SVN в VersionInfo.cs
Все наши проекты в нашем SLN совместно используют VersionInfo.cs, который содержит номер версии проекта.
[assembly: AssemblyVersion("0.0.1.0")]
[assembly: AssemblyFileVersion("0.0.1.0")]
Я хочу статически определить 3 первые части номера версии и последнюю часть, которую я хочу, чтобы рабочая версия SVN ревизия.
Первый шаг - определить событие предварительной сборки в VS, которое запускает сценарий cmd. Есть ли простой способ получить ревизию рабочей копии из cmd?
Второй шаг - вставить этот номер в файл VersionInfo.cs.
Вероятно, есть более элегантные способы сделать это, если у вас есть такой в магазине, просто помните, что это проект с открытым исходным кодом, и у нас нет необычного сервера сборки или чего-то подобного. Процедура развертывания просто переводит проект в режим релиза и строит:D
5 ответов
Решение hmjd:s было только наполовину, если вы пишете в файл каждый раз, когда создаете все проекты, ссылающиеся на файл Versionfile, который необходимо перестроить, даже если ничего не изменилось, я изменил сценарий так, чтобы запись в файл производилась только при новом номере ревизии.
@ECHO off
FOR /F "tokens=1,2 delims=:M" %%A in ('svnversion ../ -c') do SET PART_1=%%A&SET PART_2=%%B
SET file=../VersionInfo.cs
IF NOT DEFINED PART_2 (
SET SVN_REV=%PART_1%
)
IF NOT DEFINED SVN_REV (
SET SVN_REV=%PART_2%
)
set result=0
for /f "tokens=3" %%f in ('find /c /i ".%SVN_REV%." %file%') do set result=%%f
IF %result% gtr 0 (
GOTO end
)
ECHO using System.Reflection; > %file%
ECHO [assembly: AssemblyVersion("0.1.%SVN_REV%.0")] >> %file%
ECHO [assembly: AssemblyFileVersion("0.1.%SVN_REV%.0")] >> %file%
:end
- Если это VisualStudio, то это Windows
Если это Windows, вы можете использовать SubWCRev от TortoiseSVN
- Записать шаблон VersionInfo.cs в хранилище вместо окончательного файла, где изменяемая часть данных заменяется (соответствующим) ключевым словом SubWCRev.
- На каждом процессе сборки запускается SubWCRev, который записывает окончательный файл с фактическими данными из шаблона и данными WC (полный строитель может быть запущен / запущен так же просто, как
svn export
+subwcrev wc-path VersionInfo.cs.tpl VersionInfo.cs
)
Есть ли простой способ получить ревизию рабочей копии из cmd?
Существует исполняемый файл под названием svnversion.exe
который печатает на стандартном выходе ревизию. Если вы убедитесь, что это в вашем PATH
Вы могли бы назвать это.
Чтобы вставить этот номер в файл VersionInfo.cs
Вы могли бы генерировать VesionInfo.cs
файл полностью или частично из командного файла:
@echo off
FOR /F %%A in ('svnversion') do SET SVN_REV=%%A
echo [assembly: AssemblyVersion("0.0.1.%SVN_REV%")] > VersionInfo.cs
echo [assembly: AssemblyFileVersion("0.0.1.%SVN_REV%")] >> VersionInfo.cs
РЕДАКТИРОВАТЬ:
Обновлен пакетный файл для соответствия номерам ревизий формата RR
, NN:RR
а также NN:RRM
где NN
является целым числом и RR
это ревизия:
@ECHO off
FOR /F "tokens=1,2 delims=:M" %%A in ('svnversion') do SET PART_1=%%A&SET PART_2=%%B
IF NOT DEFINED PART_2 (
SET SVN_REV=%PART_1%
)
IF NOT DEFINED SVN_REV (
SET SVN_REV=%PART_2%
)
ECHO [assembly: AssemblyVersion("0.0.1.%SVN_REV%")] > VersionInfo.cs
ECHO [assembly: AssemblyFileVersion("0.0.1.%SVN_REV%")] >> VersionInfo.cs
Загрузите задачу сообщества MSBuild и установите ее.
Откройте свой.csproj и в конце (до закрытия </project>
тег)
Вставьте следующий код (не меняйте <Import>
тег):
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
После <Import>
тег вставить следующее:
<Target Name="BeforeBuild">
<SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="$(ProgramFiles)\TortoiseSVN\bin">
<Output TaskParameter="Revision" PropertyName="Revision" />
</SvnVersion>
<FileUpdate Files="Properties\AssemblyInfo.cs" Regex="(\d+)\.(\d+)\.(\d+)\.(\d+)" ReplacementText="$1.$2.$3.$(Revision)" />
</Target>
Посмотрите на Attribute ToolPath внутри тега SvnVersion, там вы должны указать место, где на вашем компьютере находится двоичный файл svnversion.exe.
Предполагая, что у вас установлено программное обеспечение TortoiseSVN, путь к нему: C:\ProgramFiles\TortoiseSVN\bin\
Вы также можете использовать двоичные файлы VisualSVN (в этом случае двоичный файл находится по адресу C:\ProgramFiles\VisualSVN\bin\
)
С этой модификацией в вашем.csproj в каждом проекте сборки MSBuild сначала вызывает svnversion.exe (с аргументом, текущим каталогом решения), а svnversion возвращает номер ревизии для этого хранилища. В теге FileUpdate MSBuild будет искать шаблон регулярного выражения, а затем заменять его текущими значениями для Major, Minor и Build ($1, $2 и $3 соответственно) и обновлять Revision со значением переменной Revision.
Вы можете попробовать использовать заменители ключевых слов, чтобы заменить число во время фиксации. У них есть это в качестве примера:
$Rev$: Revision of last commit
$Author$: Author of last commit
$Date$: Date of last commit