web-dev-qa-db-ja.com

MSBuild.exeがビルドイベントを実行しないようにできますか?

スクリプトを使用して多数のプロジェクトをビルドしています。カスタムビルドイベントをときどき使用すると、ビルドシステムに大きな困難が生じます。可能であれば、ビルドイベントの実行をブロックするような方法でMSBuild.exeを呼び出したいと思います。長い目で見れば、これはビルド自動化の問題ではありません。ビルドイベントのあるプロジェクトの提出者は、そのような略奪行為がルールに違反していることを事前に警告します。

要するに、もしあればカスタムビルドステップの実行を妨げるMSBuildを呼び出す方法はありますか?

更新:

私はプロジェクトファイルのインプレース(自動)編集を行うことを検討しましたが、3つのイベントそれぞれについて、[ビルドから除外](ビルドイベントのオプションを参照)を[はい]に設定するのと同等のコマンドラインを使用します。

51

Pre/PostBuildEventsはプロパティなので、オーバーライドするには、コマンドラインから空の文字列に設定するだけです。

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

プロパティを条件付きにすることもできます

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

プロジェクトの種類によって答えが違うようです。

C/C++プロジェクトの場合(.vcxproj)、AndreiMが示唆するように、コマンドラインで/p:PostBuildEventUseInBuild=falseを使用してPostBuildEventを抑制できます。

/p:PostBuildEventを空の文字列に設定しても、C++プロジェクトでは機能せず、ビルド後のコマンドをオーバーライドする他の方法が見つかりません)。

C#プロジェクトの場合(.csproj)、canコマンドラインで/p:PostBuildEvent=を使用してPostBuildEventを抑制します。

11
dtopham75

私が行うことは、新しい.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タスクによって実行されるビルドに渡されないために必要です。

10

MSBuildタスク内でプロパティを設定することもできます。

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

私もmsbuild foo.vcxproj /p:PreBuildEvent= /p:PostBuildEvent=で少し遊んでみましたが、おそらくカスタムのpropsファイルを使用しているため、うまくいきませんでした。

しかし、私が機能しているのは/p:PostBuildEventUseInBuild=falseでした。

3
AndreiM

一部の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ターゲットでのみ発生します。これはシンプルで永続的で、パラメーターを設定する必要はなく、正常に動作します。

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

この条件をプロジェクトのcsprojファイルのPreBuildのターゲットに追加することが、私にとって有効な唯一のソリューションです。プロジェクトのcsprojファイルで定義されているPreBuildイベントをスキップしたいVSTS内でビルドを自動化しようとしてこの問題に遭遇しました。 Visual Studio 2017を使用する、.NET Core 2.0プロジェクト。

ここに記載されているmsbuildコマンドラインの提案を試しましたが、どれもうまくいきませんでした。

0
Neil Schurrer

デフォルトでは、Microsoft.Common.targetsをインポートすると、

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

多分それを置き換えることができると思います

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

これらの事前/事後ビルドイベントをオフにします。 (インポートの前または後にそれを.projファイルに入れる必要があるかどうか、またはそのような効果を持つようにMicrosoft.Common.targetsを変更する必要があるかどうかはわかりません。今すぐ実験する時間はありません...)

0
Brian