共用方式為


只執行一次目標

如果您要使用 .NET SDK 多目標為多個架構建置 .NET 專案,一般而言,每個組建都是所有相關目標的完整組建。 不過,在某些情況下,您希望特定目標只執行一次,例如,遞增版本的目標。

設定目標

解決方案將執行 MyBeforeBuildTarget 並且僅此一次,無論建置的是單一架構還是多個架構,在此過程中均不改變目標本身。

  1. 新增運算式使用 Multitarget 屬性來判斷是否建置多個架構,或僅建置一個架構。

    <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. 將三個目標新增至專案,您只希望執行一次的目標是此處所示的MyBeforeBuildTarget,另外兩個目標如下所示:

    <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。 因此,若要為內部建置建置一次,請移除該 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
    

如您在輸出中看到的,無論是否使用多目標,警告都只發出一次。

此處顯示的解決方案有效,是因為您要運行一次的目標 MyBeforeBuildTarget 已透過 BeforeTargets 繫結至另一個不同的目標,不論多重目標化設置為 true 或 false,這個附加的目標總是只會執行一次。 外部組建是單一目標 DispatchToInnerBuilds,它針對 中指定 TargetFrameworks的所有不同架構執行內部組建 ; DispatchToInnerBuilds 本身只會針對多目標組建執行一次,但對於單一目標組建,它根本不會執行。 對於單一目標組建,您需要像往常一樣將BeforeTargets設為BeforeBuild來執行目標,但Condition需要確保它僅在單一目標的情況下附加到BeforeBuild

.NET SDK 多重目標框架支援