スクリプトを使用して多数のプロジェクトをビルドしています。カスタムビルドイベントをときどき使用すると、ビルドシステムに大きな困難が生じます。可能であれば、ビルドイベントの実行をブロックするような方法でMSBuild.exeを呼び出したいと思います。長い目で見れば、これはビルド自動化の問題ではありません。ビルドイベントのあるプロジェクトの提出者は、そのような略奪行為がルールに違反していることを事前に警告します。
要するに、もしあればカスタムビルドステップの実行を妨げるMSBuildを呼び出す方法はありますか?
更新:
私はプロジェクトファイルのインプレース(自動)編集を行うことを検討しましたが、3つのイベントそれぞれについて、[ビルドから除外](ビルドイベントのオプションを参照)を[はい]に設定するのと同等のコマンドラインを使用します。
Pre/PostBuildEventsはプロパティなので、オーバーライドするには、コマンドラインから空の文字列に設定するだけです。
msbuild foo.sln /p:PreBuildEvent= /p:PostBuildEvent=
プロパティを条件付きにすることもできます
<PreBuildEvent Condition="'$(BuildingInsideVisualStudio)' == '' Or '$(BuildingInsideVisualStudio)' == true"> ... </PreBuildEvent>
プロジェクトの種類によって答えが違うようです。
C/C++プロジェクトの場合(.vcxproj)、AndreiMが示唆するように、コマンドラインで/p:PostBuildEventUseInBuild=false
を使用してPostBuildEventを抑制できます。
(/p:PostBuildEvent
を空の文字列に設定しても、C++プロジェクトでは機能せず、ビルド後のコマンドをオーバーライドする他の方法が見つかりません)。
C#プロジェクトの場合(.csproj)、canコマンドラインで/p:PostBuildEvent=
を使用してPostBuildEventを抑制します。
私が行うことは、新しい.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タスクによって実行されるビルドに渡されないために必要です。
MSBuildタスク内でプロパティを設定することもできます。
<MSBuild
Projects="$(MSBuildProjectDirectory)\YourProject.csproj"
Properties="Configuration=$(BuildConfiguration);BuildingFromBuildProjXml=true;PreBuildEvent=;PostBuildEvent="
ContinueOnError="false" />
私もmsbuild foo.vcxproj /p:PreBuildEvent= /p:PostBuildEvent=
で少し遊んでみましたが、おそらくカスタムのpropsファイルを使用しているため、うまくいきませんでした。
しかし、私が機能しているのは/p:PostBuildEventUseInBuild=false
でした。
一部のC#プロジェクトでは、VisualBuildビルドではPostBuildEventが機能しますが、MSBuildおよびTFSビルドでは機能しません。この目的のために、VSにPostBuildEventを追加します。 .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 Name="PreBuild" BeforeTargets="PreBuildEvent"
Condition="'$(VisualStudioDir)' != ''">
この条件をプロジェクトのcsprojファイルのPreBuildのターゲットに追加することが、私にとって有効な唯一のソリューションです。プロジェクトのcsprojファイルで定義されているPreBuildイベントをスキップしたいVSTS内でビルドを自動化しようとしてこの問題に遭遇しました。 Visual Studio 2017を使用する、.NET Core 2.0プロジェクト。
ここに記載されているmsbuildコマンドラインの提案を試しましたが、どれもうまくいきませんでした。
デフォルトでは、Microsoft.Common.targetsをインポートすると、
<PropertyGroup>
<BuildDependsOn>
BeforeBuild;
CoreBuild;
AfterBuild
</BuildDependsOn>
</PropertyGroup>
多分それを置き換えることができると思います
<PropertyGroup>
<BuildDependsOn>
CoreBuild
</BuildDependsOn>
</PropertyGroup>
これらの事前/事後ビルドイベントをオフにします。 (インポートの前または後にそれを.projファイルに入れる必要があるかどうか、またはそのような効果を持つようにMicrosoft.Common.targetsを変更する必要があるかどうかはわかりません。今すぐ実験する時間はありません...)