다음을 통해 공유


기준 패키지 버전에 대한 유효성 검사

패키지 유효성 검사를 통해 이전에 릴리스된 안정적인 패키지 버전에 대해 라이브러리 프로젝트의 유효성을 검사할 수 있습니다. 프로젝트 파일에 `PackageValidationBaselineVersion` 또는 `PackageValidationBaselineName` 속성을 추가하여 패키지 유효성 검사를 사용하도록 설정하세요.

패키지 유효성 검사는 제공된 대상 프레임워크에서 호환성이 손상되는 변경 내용을 검색합니다. 또한 대상 프레임워크 지원이 삭제되었는지도 감지합니다.

예를 들어 다음 시나리오를 고려해 보세요. AdventureWorks.Client NuGet 패키지에서 작업 중이며 실수로 호환성이 손상되는 변경을 하지 않도록 해야 합니다. 이전 버전의 패키지에 대해 API 호환성 검사를 실행하도록 패키지 유효성 검사 도구에 지시하도록 프로젝트를 구성합니다.

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <PackageVersion>1.1.0</PackageVersion>
    <EnablePackageValidation>true</EnablePackageValidation>
    <PackageValidationBaselineVersion>1.0.0</PackageValidationBaselineVersion>
  </PropertyGroup>

</Project>

몇 주 후에 라이브러리에 연결 시간 제한에 대한 지원을 추가해야 합니다. 이 메서드는 Connect 현재 다음과 같습니다.

public static HttpClient Connect(string url)
{
    // ...
}

연결 시간 제한은 고급 구성 설정이므로 선택적 매개 변수만 추가할 수 있습니다.

public static HttpClient Connect(string url, TimeSpan timeout = default)
{
    // ...
}

그러나 압축하려고 하면 오류가 발생합니다.

D:\demo>dotnet pack
MSBuild version 17.3.2+561848881 for .NET
  Determining projects to restore...
  All projects are up-to-date for restore.
  AdventureWorks.Client -> D:\demo\bin\Debug\net6.0\AdventureWorks.Client.dll
C:\Program Files\dotnet\sdk\6.0.413\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Compatibility.Common.targets(33,5): error CP0002: Member 'A.B.Connect(string)' exists on [Baseline] lib/net6.0/AdventureWorks.Client.dll but not on lib/net6.0/AdventureWorks.Client.dll [D:\demo\AdventureWorks.Client.csproj]

BaselineVersion

원본 호환성이 손상되는 변경은 아니지만 이진 호환성이 손상되는 변경임을 알 수 있습니다. 기존 메서드에 매개 변수를 추가하는 대신 새 오버로드를 추가하여 이 문제를 해결합니다.

public static HttpClient Connect(string url)
{
    return Connect(url, Timeout.InfiniteTimeSpan);
}

public static HttpClient Connect(string url, TimeSpan timeout)
{
    // ...
}

이제 프로젝트를 압축하면 성공합니다.

기본 버전이 성공했습니다

버전 2.0.0의 경우 단일 Connect 매개 변수가 있는 사용되지 않는 string 메서드를 제거하려고 합니다. 신중히 고려한 후, 이 호환성을 깨는 변경을 받아들이기로 결정합니다.

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <PackageVersion>2.0.0</PackageVersion>
    <EnablePackageValidation>true</EnablePackageValidation>
    <PackageValidationBaselineVersion>1.1.0</PackageValidationBaselineVersion>
  </PropertyGroup>

</Project>
- public static HttpClient Connect(string url)
- {
-     return Connect(url, Timeout.InfiniteTimeSpan);
- }

public static HttpClient Connect(string url, TimeSpan timeout)
{
    // ...
}

의도적으로 호환성을 손상시키는 변경에 대한 CP0002 오류를 억제하기 위해 프로젝트에 CompatibilitySuppressions.xml 파일을 추가할 수 있습니다. dotnet pack /p:GenerateCompatibilitySuppressionFile=true을(를) 한 번 호출하여 억제 파일을 자동으로 생성할 수 있습니다. 이 파일에는 패킹 과정에서 발생한 각 유효성 검사 오류에 대한 억제가 포함되어 있습니다. 자세한 내용은 억제 방법을 참조하세요.

이 예제에서 CompatibilitySuppressions.xmlCP0002 오류에 대한 억제를 포함합니다.

<?xml version="1.0" encoding="utf-8"?>
<Suppressions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Suppression>
    <DiagnosticId>CP0002</DiagnosticId>
    <Target>M:A.B.Connect(System.String)</Target>
    <Left>lib/net6.0/AdventureWorks.Client.dll</Left>
    <Right>lib/net6.0/AdventureWorks.Client.dll</Right>
    <IsBaselineSuppression>true</IsBaselineSuppression>
  </Suppression>
</Suppressions>

이 파일을 소스 제어에 체크 인하여 PR 및 향후 릴리스의 호환성이 손상되는 변경 내용을 문서화하고 검토해야 합니다.

패키지 버전 2.0.0을 릴리스한 후 CompatibilitySuppressions.xml 파일을 삭제하고 속성을 업데이트 PackageValidationBaselineVersion 하여 새 릴리스에 대한 향후 변경 내용의 유효성을 검사할 수 있습니다.

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <PackageVersion>2.1.0</PackageVersion>
    <EnablePackageValidation>true</EnablePackageValidation>
    <PackageValidationBaselineVersion>2.0.0</PackageValidationBaselineVersion>
  </PropertyGroup>

</Project>