Ответ 1
Pre/PostBuildEvents - это свойства, поэтому для их переопределения просто установите их из командной строки в пустую строку.
msbuild foo.sln /p:PreBuildEvent= /p:PostBuildEvent=
Я создаю несколько проектов с помощью script, и случайное использование событий пользовательской сборки вызывает большие трудности для системы сборки. Если это возможно, я хотел бы вызвать MSBuild.exe таким образом, чтобы блокировать выполнение любых событий сборки. В конечном счете, это не проблема автоматизации сборки. Представлятели проектов со событиями сборки предупреждаются о том, что такое заслонка противоречит правилам.
Короче говоря, существует ли способ вызвать MSBuild, который предотвратит выполнение каких-либо пользовательских шагов сборки, если они есть?
UPDATE:
Я подумал о том, чтобы сделать автоматическое редактирование файлов проекта, но предпочел бы, чтобы в командной строке был эквивалент настройки "Исключено из сборки" (см. опции "События сборки" ) "Да" для каждого из трех события.
Pre/PostBuildEvents - это свойства, поэтому для их переопределения просто установите их из командной строки в пустую строку.
msbuild foo.sln /p:PreBuildEvent= /p:PostBuildEvent=
Вы также можете сделать свойство условным
<PreBuildEvent Condition="'$(BuildingInsideVisualStudio)' == '' Or '$(BuildingInsideVisualStudio)' == true"> ... </PreBuildEvent>
Что бы я сделал, это определить новый .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.
Кажется, что ответ отличается в зависимости от типа проекта.
Для проектов C/С++ (.vcxproj) вы можете отключить PostBuildEvent в командной строке с помощью /p:PostBuildEventUseInBuild=false
, как предлагает AndreiM.
(Установка /p:PostBuildEvent
в пустую строку не работает для проектов на С++, и я не могу найти другого способа переопределить команду post-build).
Для проектов С# (.csproj) вы можете подавить PostBuildEvent в командной строке с помощью /p:PostBuildEvent=
, как предлагают большинство других респондентов.
Вы также можете установить свойства в своей задаче MSBuild:
<MSBuild
Projects="$(MSBuildProjectDirectory)\YourProject.csproj"
Properties="Configuration=$(BuildConfiguration);BuildingFromBuildProjXml=true;PreBuildEvent=;PostBuildEvent="
ContinueOnError="false" />
Я также немного сыграл с msbuild foo.vcxproj /p:PreBuildEvent= /p:PostBuildEvent=
, но для меня это не сработало, возможно, потому что я использую собственные реквизиты.
То, что я нашел для работы, было /p:PostBuildEventUseInBuild=false
По умолчанию при импорте Microsoft.Common.targets вы получаете
<PropertyGroup>
<BuildDependsOn>
BeforeBuild;
CoreBuild;
AfterBuild
</BuildDependsOn>
</PropertyGroup>
Я думаю, вы можете просто заменить его на
<PropertyGroup>
<BuildDependsOn>
CoreBuild
</BuildDependsOn>
</PropertyGroup>
чтобы отключить эти события pre/post build. (Не уверен, что вам нужно поместить это в ваш .proj файл до или после импорта, или если вам нужно изменить Microsoft.Common.targets, чтобы иметь такой эффект. Не успевайте экспериментировать прямо сейчас...)
В некоторых проектах С# мне нужно, чтобы 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. Это просто, постоянно, не нужно устанавливать параметры и отлично работать.
Щелкните правой кнопкой мыши проект, выберите "Выгрузить проект"
Щелкните правой кнопкой мыши проект и выберите "Изменить
Найдите интересующее вас событие, например, для меня мне нужно было удалить PostBuild:
<PropertyGroup>
<PostBuildEvent>"$(TargetDir)filename.exe" "$(ProjectDir)"</PostBuildEvent>
</PropertyGroup>
прокомментируйте это:
<!--<PostBuildEvent>"$(TargetDir)filename.exe" "$(ProjectDir)"</PostBuildEvent>-->
Щелкните правой кнопкой мыши проект и выберите "Обновить проект"
Восстановить проект