.NET SDK 다중 대상을 사용하여 여러 프레임워크에 대한 .NET 프로젝트를 빌드하는 경우 일반적으로 각 빌드는 모든 관련 대상의 완전한 빌드입니다. 그러나 경우에 따라 특정 대상을 한 번만 실행하려고 합니다(예: 버전을 증가시키는 대상).
대상 설정
여기에 표시된 솔루션은 단일 프레임워크가 빌드되고 있는지 또는 여러 프레임워크가 빌드되고 있는지 여부에 관계없이 대상 자체를 변경하지 않고 한 번만 실행됩니다 MyBeforeBuildTarget .
Condition속성을 사용하는 식을 추가하여 여러 프레임워크를 빌드할지 아니면 하나만 빌드할지 결정합니다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>프로젝트에 세 개의 타겟을 추가하세요. 당신이 한 번만 실행하려는 타겟과, 여기서 보여지는 바와 같이 나머지 두 개의 타겟을 추가하세요.
<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인지 거짓인지 여부에 관계없이 연결된 대상은 항상 한 번 실행되는 대상입니다. 외부 빌드는 모든 지정된 프레임워크에 대해 내부 빌드를 실행하는 단일 대상인 DispatchToInnerBuilds입니다. DispatchToInnerBuilds 자체는 다중 대상 빌드의 경우 한 번만 실행되지만, 단일 대상 빌드의 경우 전혀 실행되지 않습니다. 단일 대상 빌드의 경우 대상을 실행하기 위해 BeforeTargets를 평소와 같이 BeforeBuild로 설정하지만, 단일 대상의 경우에만 Condition가 BeforeBuild에 연결되도록 보장합니다.