Получение номера редакции рабочей копии 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

    1. Записать шаблон VersionInfo.cs в хранилище вместо окончательного файла, где изменяемая часть данных заменяется (соответствующим) ключевым словом SubWCRev.
    2. На каждом процессе сборки запускается 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
Другие вопросы по тегам