如果您要使用 .NET SDK 多目標為多個架構建置 .NET 專案,一般而言,每個組建都是所有相關目標的完整組建。 不過,在某些情況下,您希望特定目標只執行一次,例如,遞增版本的目標。
設定目標
解決方案將執行 MyBeforeBuildTarget 並且僅此一次,無論建置的是單一架構還是多個架構,在此過程中均不改變目標本身。
新增運算式使用
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>將三個目標新增至專案,您只希望執行一次的目標是此處所示的
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 屬性。 這會調用指定的目標的外部構建,而不是在每個內部構建中執行。
建置專案
從命令列中,在不使用多目標的情況下建置:
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
如您在輸出中看到的,無論是否使用多目標,警告都只發出一次。
此處顯示的解決方案有效,是因為您要運行一次的目標 MyBeforeBuildTarget 已透過 BeforeTargets 繫結至另一個不同的目標,不論多重目標化設置為 true 或 false,這個附加的目標總是只會執行一次。 外部組建是單一目標 DispatchToInnerBuilds,它針對 中指定 TargetFrameworks的所有不同架構執行內部組建 ; DispatchToInnerBuilds 本身只會針對多目標組建執行一次,但對於單一目標組建,它根本不會執行。 對於單一目標組建,您需要像往常一樣將BeforeTargets設為BeforeBuild來執行目標,但Condition需要確保它僅在單一目標的情況下附加到BeforeBuild。