다음을 통해 공유


MSBuild 버전 찾기 및 사용

애플리케이션의 프로그래밍 방식 빌드가 Visual Studio 또는 MSBuild.exe 내에서 수행된 빌드와 일치하도록 하려면 특정 버전의 Visual Studio와 함께 설치된 동일한 버전의 MSBuild 어셈블리를 로드하고 해당 버전의 Visual Studio 내에서 사용할 수 있는 동일한 SDK를 사용해야 할 수 있습니다. 또는 다양한 버전의 MSBuild, .NET 및 Visual Studio가 설치된 컴퓨터에서 실행되는 빌드 애플리케이션을 만들 때 일관된 버전의 MSBuild를 찾아 사용할 수도 있습니다. Microsoft.Build.Locator API는 이 프로세스를 간소화합니다.

Microsoft.Build.Locator 사용

Microsoft.Build.Locator 패키지는 Visual Studio가 설치된 환경이나 Visual Studio 빌드 도구만 설치하거나 dotnet build 명령줄을 사용하여 빌드를 요청하는 경우와 같이 .NET SDK만 설치된 환경에서 애플리케이션이 클라이언트 머신, 가상 머신 또는 컨테이너 내에서 실행되는 상황과 관련이 있습니다. 어쨌든 애플리케이션은 원하는 버전의 MSBuild를 찾아야 합니다. 해당 버전의 MSBuild는 애플리케이션을 사용할 수 있는 환경의 다양한 컴퓨터 구성에 관계없이 Visual Studio, MSBuild.exe 또는 dotnet build특정 일관된 버전과 일치하는 버전일 수 있습니다.

Warning

Microsoft.Build.Locator 패키지에는 .NET Framework 및 .NET Core용 어셈블리가 포함되어 있습니다(.NET 5 이상에도 적용 가능). .NET Framework 애플리케이션에서는 Microsoft.Build.Locator의 .NET Framework 버전이 사용되고 .NET Core 애플리케이션에서는 .NET Core 버전이 사용됩니다. 그러나 .NET Core 버전은 Visual Studio 설치 또는 Visual Studio Build Tools 설치가 아니라 .NET SDK 설치에서 dotnet.exe에 의해 사용되는 MSBuild인 .NET Core를 사용하여 빌드된 MSBuild의 인스턴스만 찾을 수 있습니다. Microsoft.Build.Locator의 .NET Framework 버전은 .NET SDK 설치가 아닌 Visual Studio 설치, Visual Studio Build Tools 설치만 볼 수 있습니다. 따라서 두 가지 대상 프레임워크 구성으로 도구를 빌드하여 둘 다 대상으로 지정해야 할 수 있습니다.

애플리케이션과 Microsoft.Build.Locator.dll 재배포하는 경우 다른 MSBuild 어셈블리를 배포할 필요가 없습니다.

로케이터 API를 사용하려면 아래에 설명된 대로 프로젝트를 몇 가지 변경해야 합니다. 프로젝트를 업데이트하는 데 필요한 변경의 예를 보려면 MSBuildLocator 리포지토리에서 예제 프로젝트에 만든 커밋을 참조하세요.

MSBuild 참조 변경

MSBuild가 중앙 위치에서 로드되도록 하려면 애플리케이션과 함께 해당 어셈블리를 배포하지 말아야 합니다.

중앙 위치에서 MSBuild를 로드하지 않도록 프로젝트를 변경하기 위한 메커니즘은 MSBuild를 참조하는 방법에 따라 달라집니다.

NuGet 패키지 사용(기본 설정됨)

이러한 지침에서는 PackageReference 스타일 NuGet 참조를 사용한다고 가정합니다.

해당 NuGet 패키지에서 MSBuild 어셈블리를 참조하도록 프로젝트 파일을 변경합니다. 어셈블리가 빌드 시에만 필요하고 출력 디렉터리에 복사하지 말아야 함을 NuGet에 알리도록 ExcludeAssets=runtime을 지정합니다.

MSBuild 패키지의 주 및 부 버전은 지원하려는 Visual Studio의 최소 버전보다 작거나 같아야 합니다. 예를 들어 Visual Studio 2017 및 이후 버전을 지원하려면 패키지 버전 15.1.548을 참조하세요.

예를 들어 이 XML을 사용할 수 있습니다.

<ItemGroup>
  <PackageReference Include="Microsoft.Build" Version="15.1.548" ExcludeAssets="runtime" />
  <PackageReference Include="Microsoft.Build.Utilities.Core" Version="15.1.548" ExcludeAssets="runtime" />
</ItemGroup>

확장 어셈블리 사용

NuGet 패키지를 사용할 수 없는 경우 Visual Studio와 함께 배포되는 MSBuild 어셈블리를 참조할 수 있습니다. MSBuild를 직접 Copy LocalFalse참조하는 경우 . 프로젝트 파일에서 이 설정은 다음 코드와 유사합니다.

    <Reference Include="Microsoft.Build, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <Private>False</Private>
    </Reference>

참고 항목

15 이전 버전의 MSBuild에서 업데이트하는 경우 MSBuild는 특정 어셈블리(Microsoft.Build 어셈블리)에 대한 바인딩 리디렉션이 필요하지만 패키지를 참조 Microsoft.Build.Locator 하는 경우 애플리케이션에서 필요한 바인딩 리디렉션을 버전 15.1.0.0으로 자동으로 사용하는지 확인합니다. 이 버전으로의 바인딩 리디렉션은 MSBuild 15.x, 16.x 및 17.x를 지원합니다.

출력 정리 확인

프로젝트를 빌드하고 출력 디렉터리를 검사하여 다음 단계에서 추가된 어셈블리 이외의 Microsoft.Build.Locator.dll어셈블리가 포함되어 Microsoft.Build.*.dll 있지 않은지 확인합니다.

Microsoft.Build.Locator에 대한 패키지 참조 추가

Microsoft.Build.Locator에 대한 NuGet 패키지 참조를 추가합니다.

    <PackageReference Include="Microsoft.Build.Locator">
      <Version>1.1.2</Version>
    </PackageReference>

Microsoft.Build.Locator 패키지에 대해서는 지정 ExcludeAssets=runtime 하지 마세요.

MSBuild를 호출하기 전에 인스턴스 등록

일반적인 용도로 빌드 애플리케이션을 만드는 경우 애플리케이션이 실행 중인 컴퓨터에 설치될 수 있는 Visual Studio, .NET 및 MSBuild 버전을 알 수 없습니다. MSBuildLocator의 목적은 다양한 설치 환경이 있는 컴퓨터에서 사용할 적절한 MSBuild 설치를 찾는 것입니다. MSBuildLocator를 사용하면 사용할 MSBuild를 결정하는 몇 가지 논리를 지정할 수 있지만 애플리케이션 개발자는 필요한 MSBuild 버전을 결정하거나 허용할 수 있는 MSBuild 버전을 결정해야 합니다. 그렇지 않으면 사용자가 버전을 지정하고 해당 선택을 MSBuildLocator API에 대한 적절한 호출로 변환하는 논리를 포함할 수 있습니다.

로케이터 API 호출을 추가하는 가장 간단한 방법은 애플리케이션 시작 코드에 MSBuildLocator.RegisterInstance 호출을 추가하는 것입니다. 한 가지 예는 여기에 표시된 대로 최신 버전을 선택하는 것이지만 애플리케이션에는 고유한 요구 사항이 있을 수 있습니다.

MSBuildLocator를 호출하는 메서드에서는 Microsoft.Build MSBuild 형식(네임스페이스에서)을 참조할 수 없습니다. 예를 들어 다음과 같은 코드를 사용할 수 없습니다.

void ThisWillFail()
{
    // Register the most recent version of MSBuild
    RegisterInstance(MSBuildLocator.QueryVisualStudioInstances().OrderByDescending(
       instance => instance.Version).First());
    Project p = new Project(SomePath); // Could be any MSBuild type
    // Code that uses the MSBuild type
}

대신 다음과 같은 코드를 작성합니다.

void MethodThatDoesNotDirectlyCallMSBuild()
{
    var instance = ... // select which of the installed instances to use
    
    // Register a specific instance of MSBuild
    MSBuildLocator.RegisterInstance(instance);
    MethodThatCallsMSBuild();
}

void MethodThatCallsMSBuild()
{
    Project p = new Project(SomePath);
    // Code that uses the MSBuild type
}

MSBuild 인스턴스를 지정하려면 필요한 사용자 지정 논리를 사용하여 MSBuildLocator.RegisterInstance에 전달할 MSBuildLocator.QueryVisualStudioInstances의 결과를 선택할 수 있습니다.

MSBuild API 참조를 살펴보고 MSBuild API에 대해 알아봅니다.