.NET SDK マルチターゲットを使用して複数のフレームワーク用の .NET プロジェクトをビルドする場合、通常、各ビルドは関連するすべてのターゲットの完全なビルドです。 ただし、バージョンをインクリメントするターゲットなど、特定のターゲットを 1 回だけ実行したい場合もあります。
ターゲットを設定する
ここで示すソリューションは、1 つのフレームワークがビルドされているかどうか、または複数のフレームワークがビルドされているかどうかに関係なく、ターゲット自体を変更せずに、 MyBeforeBuildTarget を 1 回だけ実行します。
Conditionプロパティを使用する式Multitarget追加して、複数のフレームワークをビルドするか、1 つだけをビルドするかを決定します。<PropertyGroup> <TargetFrameworks Condition=" '$(Multitarget)' == 'true' ">net7.0;net8.0</TargetFrameworks> <TargetFramework Condition=" '$(Multitarget)' != 'true' ">net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <SuppressNETCoreSdkPreviewMessage>true</SuppressNETCoreSdkPreviewMessage> </PropertyGroup>3 つのターゲットをプロジェクトに追加します。1 回だけ実行するターゲット (
MyBeforeBuildTarget)、他の 2 つを次に示します。<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks Condition=" '$(Multitarget)' == 'true' ">net7.0;net8.0</TargetFrameworks> <TargetFramework Condition=" '$(Multitarget)' != 'true' ">net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <SuppressNETCoreSdkPreviewMessage>true</SuppressNETCoreSdkPreviewMessage> </PropertyGroup> <Target Name="MyBeforeBuildTarget"> <Warning Text="MyBeforeBuildTarget" /> </Target> <Target Name="BuildMyBeforeBuildTargetBeforeOuterBuild" DependsOnTargets="MyBeforeBuildTarget" BeforeTargets="DispatchToInnerBuilds" /> <Target Name="BuildMyBeforeBuildTargetBeforeInnerBuild" BeforeTargets="BeforeBuild"> <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="MyBeforeBuildTarget" RemoveProperties="TargetFramework" /> </Target> </Project>
このメソッドは、.NET SDK プロジェクトでマルチターゲットが機能する方法に依存します。 外側のビルドは TargetFrameworks 設定されますが、内部ビルドは目的のターゲットごとに TargetFramework 設定されます。 したがって、内部ビルドに対して 1 回ビルドするには、 TargetFramework プロパティを削除します。 これにより、各内部ビルドで実行されるのではなく、目的のターゲットを使用して外部ビルドが呼び出されます。
プロジェクトをビルドする
コマンド ラインから、マルチターゲットなしでビルドします。
dotnet msbuild -nologo -tl:false -bl -clp:nosummary -p:Multitarget=falseExtendMaybeMultitargeted.csproj(12,5): warning : MyBeforeBuildTarget ExtendMaybeMultitargeted -> ExtendMaybeMultitargeted\bin\Debug\net8.0\ExtendMaybeMultitargeted.dll次に、マルチターゲットを使用してビルドしてみてください。
dotnet msbuild -nologo -tl:false -bl -clp:nosummary -p:Multitarget=trueExtendMaybeMultitargeted\ExtendMaybeMultitargeted.csproj(12,5): warning : MyBeforeBuildTarget ExtendMaybeMultitargeted -> ExtendMaybeMultitargeted\bin\Debug\net8.0\ExtendMaybeMultitargeted.dll ExtendMaybeMultitargeted -> ExtendMaybeMultitargeted\bin\Debug\net7.0\ExtendMaybeMultitargeted.dll
出力でわかるように、マルチターゲットが使用されたかどうかに関係なく、警告は 1 回だけ出力されました。
ここで示すソリューションは、1 回実行するターゲット ( MyBeforeBuildTarget) が BeforeTargetsを使用して別のターゲットに関連付けられているため機能しますが、マルチターゲットが true か false かに関係なく、アタッチされるターゲットは常に 1 回実行されます。 外側のビルドは、DispatchToInnerBuildsで指定されたすべての異なるフレームワークに対して内部ビルドを実行する単一のターゲットTargetFrameworksです。DispatchToInnerBuilds自体は、マルチターゲット ビルドに対して 1 回だけ実行されますが、1 つのターゲット ビルドではまったく実行されません。 1 つのターゲット ビルドの場合は、ターゲットを実行するために通常どおりBeforeTargetsにBeforeBuildを設定しますが、Conditionでは、単一ターゲットの場合にのみBeforeBuildにアタッチされます。