Можете ли вы запретить MSBuild.exe запускать события сборки? - PullRequest
51 голосов
/ 14 ноября 2009

Я строю несколько проектов с помощью скрипта, и случайное использование пользовательских событий сборки вызывает большие трудности для системы сборки. Если это возможно, я бы хотел вызвать MSBuild.exe таким образом, чтобы блокировать выполнение любых событий сборки. В конечном счете, это не проблема для автоматизации сборки - авторы проектов с событиями сборки предупреждены, что такие snafuery противоречат правилам.

Короче говоря, есть ли способ вызвать MSBuild, который предотвратит выполнение каких-либо пользовательских шагов сборки, если они есть?

UPDATE:

Я бы подумал о том, чтобы выполнить автоматическое редактирование файлов проекта на месте, но я бы предпочел, чтобы в командной строке для параметра «Исключено из сборки» (см. Параметры событий сборки) было выбрано «Да» для каждого из трех события.

Ответы [ 9 ]

85 голосов
/ 14 ноября 2009

Pre / PostBuildEvents являются свойствами, поэтому для их переопределения просто установите их из командной строки в пустую строку.

msbuild foo.sln /p:PreBuildEvent= /p:PostBuildEvent=
13 голосов
/ 19 октября 2012

Вы также можете сделать свойство условным

<PreBuildEvent Condition="'$(BuildingInsideVisualStudio)' == '' Or '$(BuildingInsideVisualStudio)' == true"> ... </PreBuildEvent>
11 голосов
/ 21 апреля 2015

Похоже, что ответ зависит от типа проекта.

Для проектов C / C ++ (.vcxproj) вы можете подавить PostBuildEvent в командной строке с помощью /p:PostBuildEventUseInBuild=false, как предлагает AndreiM.

(Установка /p:PostBuildEvent для пустой строки не работает для проектов C ++, и я не могу найти какой-либо другой способ переопределить команду после сборки).

Для проектов C # (.csproj) вы можете подавить PostBuildEvent в командной строке с помощью /p:PostBuildEvent=, как предлагают большинство других респондентов.

10 голосов
/ 14 ноября 2009

Что бы я сделал, это определил новый файл .proj, скажем, C: \ Data \ SupressBuildEvents.proj и он будет содержать:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="PostBuildEvent"/>

    <Target Name="PreBuildEvent" />
</Project>

Затем необходимо указать, что эти файлы импортируются после Microsoft.Common.targets, и вы должны сделать это, задав хорошо известное свойство CustomAfterMicrosoftCommonTargets для пути к этому файлу. Итак, пусть ваш скрипт сборки находится в файле с именем MyBuild.proj, который вы бы назвали так:

msbuild MyBuild.proj /p:CustomAfterMicrosoftCommonTargets="C:\Data\SupressBuildEvents.proj
"

Это заставит MSBuild импортировать ваш файл после импорта файла Microsoft.Common.targets и переопределит цели PostBuildEvent и PreBuildEvent и заставит их ничего не делать.

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

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <ProjectsToBuild Include=" FILL THIS IN "/>
    </ItemGroup>

    <Target Name="YourTarget">
        <MSBuild Projects="@(ProjectsToBuild)"
                 Properties="CustomAfterMicrosoftCommonTargets=$(CustomAfterMicrosoftCommonTargets)"/>
    </Target>

</Project>

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

4 голосов
/ 22 апреля 2013

Вы также можете установить свойства в своей задаче MSBuild:

<MSBuild 
  Projects="$(MSBuildProjectDirectory)\YourProject.csproj" 
  Properties="Configuration=$(BuildConfiguration);BuildingFromBuildProjXml=true;PreBuildEvent=;PostBuildEvent=" 
  ContinueOnError="false" />
3 голосов
/ 05 февраля 2015

Я также немного поиграл с msbuild foo.vcxproj /p:PreBuildEvent= /p:PostBuildEvent=, но для меня это не сработало, возможно, потому, что я использую файлы с пользовательским реквизитом.

То, что я нашел для работы, однако, было /p:PostBuildEventUseInBuild=false

1 голос
/ 01 августа 2017

В некоторых проектах на C # мне нужно, чтобы PostBuildEvent работал в сборке Visual Studio, но не работал в сборке MSBuild и TFS. Для этого я добавляю PostBuildEvent в VS. Он устанавливает следующий код в .csproj:

  <PropertyGroup>
    <PostBuildEvent>*... my custom post build event ....*</PostBuildEvent>
  </PropertyGroup>

после этого я добавляю следующие коды в .csproj:

  <Target Name="BeforeBuild">
      <PropertyGroup Condition="'$(BuildingInsideVisualStudio)' == 'false' Or '$(BuildingInsideVisualStudio)' != 'true'">
        <PostBuildEvent></PostBuildEvent>
      </PropertyGroup>
  </Target>

Этот код устанавливает PostBuildEvent пустым, и это происходит только в целевых объектах MSBuild и TFSBuild BeforeBuild. Он простой, постоянный, не требует установки параметров и отлично работает.

0 голосов
/ 11 января 2018
<Target Name="PreBuild" BeforeTargets="PreBuildEvent" 
Condition="'$(VisualStudioDir)' != ''">

Добавление этого условия в Target для PreBuild в файле проекта csproj - единственное решение, которое сработало для меня. Я столкнулся с этой проблемой, пытаясь автоматизировать сборку в VSTS, где я хотел пропустить событие PreBuild, определенное в файле проекта csproj. Использование Visual Studio 2017, проект .NET Core 2.0.

Я попробовал перечисленные здесь предложения командной строки msbuild, но ни один из них не помог мне.

0 голосов
/ 14 ноября 2009

По умолчанию при импорте Microsoft.Common.targets вы получаете

<PropertyGroup>
    <BuildDependsOn>
        BeforeBuild;
        CoreBuild;
        AfterBuild
    </BuildDependsOn>
</PropertyGroup>

Я думаю, вы можете просто заменить его на

<PropertyGroup>
    <BuildDependsOn>
        CoreBuild
    </BuildDependsOn>
</PropertyGroup>

чтобы отключить эти события до / после сборки. (Не уверен, если вам нужно поместить это в ваш файл .proj до или после импорта, или если вам нужно изменить Microsoft.Common.targets, чтобы получить такой эффект. У вас нет времени сейчас экспериментировать ...)

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