MSBuild Post-Build - PullRequest
       25

MSBuild Post-Build

5 голосов
/ 26 ноября 2010

У меня есть скрипт MSBuild, который почти выполняет все, что мне нужно, кроме шага после сборки (см. Предыдущий вопрос, который я задавал: Условный Exec MSBuild? ).

Я собираюсь собрать множество файлов csproj и, при необходимости, выполнить шаги после сборки, если и только если проект был собран. Я не хочу выполнять мой шаг после сборки все время, иначе временная метка моего окончательного результата будет изменена без необходимости (и это делает процесс сборки очень трудоемким без всякой причины).

В моем скрипте MSBuild у меня есть что-то вроде следующего для каждого из моих файлов csproj:

<Target Name="ProjectName">
   <MSBuild Projects="PathToProject" Properties="Configuration=$(buildtype)" />
</Target>

Edit: Я думаю, что я действительно хочу сделать, это определить, когда задача CoreCompile запускается для каждого проекта. Если бы был какой-нибудь способ проверить это в условии?

Есть идеи?

Я новичок в MSBuild, так что, возможно, я на неправильном пути!

Спасибо, Alan

Ответы [ 3 ]

3 голосов
/ 28 февраля 2014

вы также можете сделать это на основе конфигурации, выбранной в процессе сборки.Для CI вы всегда должны использовать «Release» или «Production» (вы можете определить свой собственный)

1 голос
/ 28 ноября 2010

После долгих поисков простого решения этой проблемы я не нашел его и в итоге нашел собственное решение, которое работает, но, возможно, не является лучшим решением.Тем не менее, я хотел бы поделиться этим с кем-то еще, у кого есть такая же проблема, чтобы вы могли по крайней мере иметь рабочее решение и, надеюсь, сэкономить вам много голов.

Напомним, что я хотел сделатьбыл запущен инструмент командной строки после того, как мой проект был построен, но только если сборка была обновлена ​​(т.е. метка времени изменилась).Я не хотел помещать это в раздел пост-сборки каждого проекта, потому что я хотел, чтобы пост-сборка происходила только на нашем сервере сборки (не на машинах разработки).

Я не нашел никакого способаделать это внешне в моем основном файле .proj и в конечном итоге изменить раздел пост-сборки каждого файла .csproj.Однако я поставил перед ним условие if примерно так:

if '$(ExecuteCommand)' == 'true' command.exe

Это означает, что команда никогда не будет выполнена на компьютере разработчика, но когда я вызываю сборку из моего файла .proj, я могу установить, чтоотметьте true следующим образом:

<!-- Define common properties -->
<PropertyGroup>
    <ExecuteCommand>true</ExecuteCommand>
</PropertyGroup>

<Target Name="YourTarget">
    <!-- Build project -->
    <MSBuild Projects="Path to project" Properties="ExecuteCommand=$(ExecuteCommand)" />
</Target>

Как я уже сказал, я не думаю, что это самое изящное решение, но оно, безусловно, работает и будет достаточно для меня на данный момент.Однако мне все равно было бы интересно узнать, как правильно добиться этого, чтобы я мог улучшить свой сценарий.

Спасибо, Алан

0 голосов
/ 04 января 2018

Если вы можете добавить следующее к каждому из ваших проектов:

<Target Name="DoStuffWithNewlyCompiledAssembly">
    <Exec Command="command.exe" />
</Target>

... тогда вам нужно только добавить свойство:

<Target Name="Name">
  <MSBuild Projects="" Properties="TargetsTriggeredByCompilation=DoStuffWithNewlyCompiledAssembly" />
</Target>

Это работает, потому что кто-то умный в Microsoft добавил следующую строку в конце цели CoreCompile в Microsoft.[CSharp|VisualBasic][.Core].targets (имя файла зависит от языка и версии MSBuild / Visual Studio).

<CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''"/>

Таким образом, если вы указали имя цели в свойстве TargetsTriggeredByCompilation, ваша цель будет работать, если CoreCompile выполняется - и ваша цель не будет работать, если пропущена CoreCompile (например, потому что выходная сборка уже запущена. на сегодняшний день в отношении кода).

...