Подтвердить что ты не робот

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

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

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

UPDATE:

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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

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

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

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

Ответ 8

В некоторых проектах С# мне нужно, чтобы PostBuildEvent работал в Visual Studio build, но не работает в сборке 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. Это просто, постоянно, не нужно устанавливать параметры и отлично работать.

Ответ 9

Щелкните правой кнопкой мыши проект, выберите "Выгрузить проект"

Щелкните правой кнопкой мыши проект и выберите "Изменить

Найдите интересующее вас событие, например, для меня мне нужно было удалить PostBuild:

    <PropertyGroup>
        <PostBuildEvent>"$(TargetDir)filename.exe" "$(ProjectDir)"</PostBuildEvent>
    </PropertyGroup>

прокомментируйте это:

    <!--<PostBuildEvent>"$(TargetDir)filename.exe" "$(ProjectDir)"</PostBuildEvent>-->

Щелкните правой кнопкой мыши проект и выберите "Обновить проект"

Восстановить проект