Как всегда выполнить цель в MSBuild - PullRequest
4 голосов
/ 13 сентября 2010

У меня есть файл MSBuild, который манипулирует файлом AssemblyInfo до компиляции приложения.В конце сборки восстанавливает файл AssemblyInfo.Он делает это путем резервного копирования файла, манипулирования им, а затем по истечении времени сборки, восстановления файла.

Это работает довольно хорошо, за исключением случаев, когда во время сборки возникает ошибка.Затем он не восстанавливает исходный файл.Есть ли способ, которым я могу сказать MSBuild выполнить цель в конце сборки, независимо от того, удалась она или нет?

Ответы [ 3 ]

5 голосов
/ 15 сентября 2010

Исходя из вашего последнего комментария к исходному вопросу, я бы выбрал другой подход и забыл подход, который вы используете в настоящее время. Вы должны знать, что информация о вашей версии не обязательно должна быть в файле AssemblyInfo.cs. Он может находиться в любом файле кода, если только у вас есть только атрибуты AssemblyVersion и AssemblyFileVersion, определенные по одному. С учетом сказанного, я бы сделал следующее:

  1. Удаление AssemblyVersion и AssemblyFileVersion из AssemblyInfo.cs
  2. Создайте новый файл, назовите его как хотите, в моем случае я поместил его в Properties \ VersionInfo.cs. Не добавлять этот файл в проект.
  3. Отредактируйте файл проекта, включив этот файл в список файлов, которые будут компилироваться, только когда вы этого захотите

Давайте немного расширим # 3. Когда вы создаете проект .NET, сам проект является файлом MSBuild. Внутри этого файла вы найдете элемент, объявленный Compile. Это список файлов, которые будут отправлены компилятору для компиляции. Вы можете динамически включать / исключать файлы из этого списка. В вашем случае вы хотите включить файл VersionInfo.cs только в том случае, если вы строите на сервере сборки (или при любых других определенных вами условиях). Для этого примера я определил это условие, если проект строился в режиме выпуска. Таким образом, для режима Release VersionInfo.cs будет отправляться компилятору, а для других сборок - нет. Вот содержимое VersionInfo.cs

VersionInfo.cs

[assembly: System.Reflection.AssemblyVersion("1.2.3.4")]
[assembly: System.Reflection.AssemblyFileVersion("1.2.3.4")]

Чтобы подключить это к процессу сборки, вам нужно отредактировать файл проекта. В этом файле вы найдете элемент (может быть больше 1 в зависимости от типа проекта). Вы должны добавить цель, подобную следующей.

<Target Name="BeforeCompile">
  <ItemGroup Condition=" '$(Configuration)'=='Release' ">
    <Compile Include="Properties\VersionInfo.cs" />
  </ItemGroup>
</Target>

Вот что я здесь сделал, чтобы определить цель, BeforeCompile, которая является известной целью, которую вы можете переопределить. См. Эту статью MSDN о других подобных целях. По сути, это цель, которая всегда будет вызываться до вызова компилятора. В этой цели я добавляю VersionInfo.cs в элемент Compile, только если для свойства Configuration установлено значение release. Вы можете определить это свойство как хотите. Например, если в качестве сервера сборки используется TFS, это может быть

<Target Name="BeforeCompile">
  <ItemGroup Condition=" '$(TeamFoundationServerUrl)'!='' ">
    <Compile Include="Properties\VersionInfo.cs" />
  </ItemGroup>
</Target>

Поскольку мы знаем, что TeamFoundationServerUrl определяется только при сборке через TFS.

Если вы строите из командной строки, то что-то вроде этого

<Target Name="BeforeCompile">
  <ItemGroup Condition=" '$(IncludeVersionInfo)'=='true' ">
    <Compile Include="Properties\VersionInfo.cs" />
  </ItemGroup>
</Target>

А при сборке проекта просто сделайте msbuild.exe YourProject.proj / p: IncludeVersion = true. Примечание: это не будет работать при построении решения.

2 голосов
/ 15 сентября 2010

Как насчет изменения проблемы:

  • Добавьте «шаблон» AssemblyInfo.cs.template в систему управления версиями, которая представляет ваш «идеальный» AssemblyInfo.cs с перехватчиками регулярных выражений там
  • Перед сборкой скопируйте шаблон в реал и примените свои регулярные выражения
  • Добавьте какое-то игнорирование subversion для AssemblyInfo.cs (я не специалист по svn, но я уверен, что есть способ, которым вы можетескажите ему игнорировать определенные файлы)
  • В случае, если ваши разработчики должны добавить какую-то настройку, которая обычно появляется в AssemblyInfo.cs (например, InternalsVisibleTo), затем попросите их добавить ее в другой .cs файл, который зарегистрирован.

В качестве дальнейшего усовершенствования, объедините решение Сайеда с моим и удалите информацию о версии из фактического AssemblyInfo.cs и получите VersionInfo.cs.зарегистрированный шаблон, который создает VersionInfo.cs в BeforeBuild.

0 голосов
/ 13 сентября 2010

Я никогда не использовал его, но из документации кажется, что Элемент OnError полезен для того, чего вы пытаетесь достичь.

Причины одной или нескольких целейвыполнить, если атрибут ContinueOnError имеет значение false для невыполненной задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...