다음을 통해 공유


정확히 한 번 대상 실행

.NET SDK 다중 대상을 사용하여 여러 프레임워크에 대한 .NET 프로젝트를 빌드하는 경우 일반적으로 각 빌드는 모든 관련 대상의 완전한 빌드입니다. 그러나 경우에 따라 특정 대상을 한 번만 실행하려고 합니다(예: 버전을 증가시키는 대상).

대상 설정

여기에 표시된 솔루션은 단일 프레임워크가 빌드되고 있는지 또는 여러 프레임워크가 빌드되고 있는지 여부에 관계없이 대상 자체를 변경하지 않고 한 번만 실행됩니다 MyBeforeBuildTarget .

  1. 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>
    
  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을 설정합니다. 따라서 내부 빌드에 대해 한 번 빌드하려면 속성을 제거합니다 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인지 거짓인지 여부에 관계없이 연결된 대상은 항상 한 번 실행되는 대상입니다. 외부 빌드는 모든 지정된 프레임워크에 대해 내부 빌드를 실행하는 단일 대상인 DispatchToInnerBuilds입니다. DispatchToInnerBuilds 자체는 다중 대상 빌드의 경우 한 번만 실행되지만, 단일 대상 빌드의 경우 전혀 실행되지 않습니다. 단일 대상 빌드의 경우 대상을 실행하기 위해 BeforeTargets를 평소와 같이 BeforeBuild로 설정하지만, 단일 대상의 경우에만 ConditionBeforeBuild에 연결되도록 보장합니다.

.NET SDK 다중 대상 지정