Можно ли запретить MSBuild.exe запускать события сборки?

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

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

ОБНОВИТЬ:

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


person Sniggerfardimungus    schedule 13.11.2009    source источник


Ответы (9)


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

msbuild foo.sln /p:PreBuildEvent= /p:PostBuildEvent=
person radical    schedule 13.11.2009
comment
У меня это не работает, я использую MSBuild v4.0.30319.17929 - person whatsisname; 14.10.2013
comment
Использование msbuild foo.sln / p: PreBuildEvent = / p: PostBuildEvent = сработало для меня (MSBuild v4.0.30319). - person Neil; 05.12.2013
comment
У меня это тоже не сработало (проект C ++), но решение (/ p: PostBuildEventUseInBuild = false), опубликованное ниже AndreiM и dtopham75, работало нормально. - person Michaël; 18.04.2018
comment
Использование /p:PostBuildEvent="" не помогло. Это заставило MSBuild попробовать запустить команду "" (MS Build Tools 2019) - person Florian Winter; 29.04.2019

Кажется, что ответ разный в зависимости от типа проекта.

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

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

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

person dtopham75    schedule 21.04.2015
comment
Обратите внимание, что для проектов C #, если ваш файл .csproj имеет тег Exec со свойством Command, установленным на $ (PostBuildEvent), установка для PostBuildEvent пустой строки также очистит свойство Command, что приведет к ошибке сборки. Чтобы обойти это, я просто установил что-то мягкое, например, пропущенное эхо-событие после сборки, и это сработало. - person inejwstine; 02.05.2019

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

<PreBuildEvent Condition="'$(BuildingInsideVisualStudio)' == '' Or '$(BuildingInsideVisualStudio)' == true"> ... </PreBuildEvent>
person Sarin    schedule 19.10.2012

Что бы я сделал, так это определил бы новый файл .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.

person Sayed Ibrahim Hashimi    schedule 14.11.2009

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

<MSBuild 
  Projects="$(MSBuildProjectDirectory)\YourProject.csproj" 
  Properties="Configuration=$(BuildConfiguration);BuildingFromBuildProjXml=true;PreBuildEvent=;PostBuildEvent=" 
  ContinueOnError="false" />
person derFunk    schedule 22.04.2013

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

Однако я обнаружил, что работает /p:PostBuildEventUseInBuild=false

person AndreiM    schedule 05.02.2015

В некоторых проектах 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 target. Он простой, постоянный, не требует настройки параметров и отлично работает.

person AhmadYo    schedule 01.08.2017

<Target Name="PreBuild" BeforeTargets="PreBuildEvent" 
Condition="'$(VisualStudioDir)' != ''">

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

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

person Neil Schurrer    schedule 10.01.2018

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

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

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

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

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

person Brian    schedule 13.11.2009
comment
Это не то, что вы хотите делать. BeforeBuild и AfterBuild не связаны с событиями до и после сборки. - person Sayed Ibrahim Hashimi; 14.11.2009