次の方法で共有


ターゲットを 1 回だけ実行する

.NET SDK マルチターゲットを使用して複数のフレームワーク用の .NET プロジェクトをビルドする場合、通常、各ビルドは関連するすべてのターゲットの完全なビルドです。 ただし、バージョンをインクリメントするターゲットなど、特定のターゲットを 1 回だけ実行したい場合もあります。

ターゲットを設定する

ここで示すソリューションは、1 つのフレームワークがビルドされているかどうか、または複数のフレームワークがビルドされているかどうかに関係なく、ターゲット自体を変更せずに、 MyBeforeBuildTarget を 1 回だけ実行します。

  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>
    
  2. 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 プロパティを削除します。 これにより、各内部ビルドで実行されるのではなく、目的のターゲットを使用して外部ビルドが呼び出されます。

プロジェクトをビルドする

  1. コマンド ラインから、マルチターゲットなしでビルドします。

    dotnet msbuild -nologo -tl:false -bl -clp:nosummary -p:Multitarget=false

    ExtendMaybeMultitargeted.csproj(12,5): warning : MyBeforeBuildTarget
    ExtendMaybeMultitargeted -> ExtendMaybeMultitargeted\bin\Debug\net8.0\ExtendMaybeMultitargeted.dll
    
  2. 次に、マルチターゲットを使用してビルドしてみてください。

    dotnet msbuild -nologo -tl:false -bl -clp:nosummary -p:Multitarget=true

    ExtendMaybeMultitargeted\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 つのターゲット ビルドの場合は、ターゲットを実行するために通常どおりBeforeTargetsBeforeBuildを設定しますが、Conditionでは、単一ターゲットの場合にのみBeforeBuildにアタッチされます。

.NET SDK マルチターゲティング