Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: SniggerfardimungusОтветов: 9

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

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

ОБНОВИТЬ:

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

buildeventsmsbuild

Ответы

Ответ 1 · рейтинг 96 · radical

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

msbuild foo.sln /p:PreBuildEvent= /p:PostBuildEvent=

Ответ 2 · рейтинг 16 · dtopham75

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

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

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

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

Ответ 3 · рейтинг 15 · Sarin

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

<PreBuildEvent Condition="'$(BuildingInsideVisualStudio)' == '' Or '$(BuildingInsideVisualStudio)' == true"> ... </PreBuildEvent>

Ответ 4 · рейтинг 10 · Sayed Ibrahim Hashimi

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

Ответ 5 · рейтинг 4 · derFunk

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

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

Ответ 6 · рейтинг 4 · AndreiM

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

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

Ответ 7 · рейтинг 2 · AhmadYo

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

Ответ 8 · рейтинг 1 · Neil Schurrer

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

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

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

Ответ 9 · Brian

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

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы