.NET 프로젝트에서 종속성 업데이트 관리

완료됨

곧 새 버전의 라이브러리로 업데이트하려고 합니다. 어떤 기능이 사용되지 않음으로 표시되거나, 사용 중인 패키지의 최신 버전에 새 기능이 있을 수 있습니다.

라이브러리를 업데이트하기 전에 다음 사항을 고려해야 합니다.

  • 업데이트 유형: 사용할 수 있는 업데이트 유형은 무엇인가요? 소형 버그 수정인지, 필요한 새 기능이 추가되는지, 이렇게 하면 코드가 손상될까요? ‘유의적 버전’이라는 시스템을 사용하여 업데이트 유형을 알릴 수 있습니다. 라이브러리의 버전 번호를 표현하는 방법을 통해 개발자는 처리 중인 업데이트의 유형을 알게 됩니다.
  • 프로젝트가 올바르게 구성되었는지 여부: 원하는 유형의 업데이트만 가져오도록 .NET 프로젝트를 구성할 수 있습니다. 특정 업데이트 유형을 사용할 수 있는 경우에만 업데이트를 수행하면 됩니다. 예상치 못한 문제가 발생할 위험이 없으므로 권장되는 접근 방식입니다.
  • 보안 문제: 시간 경과에 따라 프로젝트 종속성을 관리하려면 발생할 수 있는 문제를 인식해야 합니다. 예를 들어 취약성이 탐지되면 문제가 발생합니다. 다행히 다운로드할 수 있는 패치가 릴리스될 것입니다. .NET Core 도구를 사용하면 라이브러리에 대해 감사를 실행하여 업데이트해야 할 패키지가 있는지 확인할 수 있습니다. 또한 문제를 해결하기 위해 적절한 조치를 취할 수 있습니다.

유의적 버전 사용

유의적 버전이라고 하는 산업 표준이 있는데, 이것은 개발자나 일부 다른 개발자가 라이브러리에 도입하는 변경 유형을 표현하는 방법입니다. 유의적 버전의 작동 방식은 패키지에 버전 번호가 있는지 확인하고 버전 번호가 다음 섹션으로 구분되도록 하는 것입니다.

  • 주 버전: 맨 왼쪽 숫자입니다. 예를 들어 1.0.0에서는 1입니다. 이 숫자가 변경되면 코드에서 호환성이 손상되는 변경이 발생한다고 예측할 수 있습니다. 코드의 일부를 다시 작성해야 할 수 있습니다.
  • 부 버전: 중간 번호입니다. 예를 들어 1.2.0에서는 2입니다. 이 숫자가 변경되면 기능이 추가되었음을 의미합니다. 코드는 계속 작동합니다. 일반적으로 업데이트를 허용해도 안전합니다.
  • 패치 버전: 맨 오른쪽 숫자입니다. 예를 들어 1.2.3에서는 3입니다. 이 숫자가 변경되면 코드에서 작동했어야 하는 항목을 수정하는 변경 내용이 적용되었음을 의미합니다. 업데이트를 허용해도 안전합니다.

다음 표에서는 버전 유형별로 버전 번호가 변경되는 방식을 보여 줍니다.

유형 수행되는 작업
주 버전 1.0.02.0.0으로 변경됩니다.
부 버전 1.1.11.2.0으로 변경됩니다.
패치 버전 1.0.11.0.2으로 변경됩니다.

많은 회사와 개발자가 이 시스템을 사용합니다. 패키지를 게시하고 NuGet 레지스트리에 푸시하려는 경우 유의적 버전을 따라야 합니다. NuGet 레지스트리에서만 패키지를 다운로드하는 경우에도 해당 패키지는 유의적 버전을 따라야 합니다.

패키지를 변경하면 버그가 비즈니스에 피해를 줄 수 있는 위험을 포함한 위험을 초래할 수 있습니다. 일부 위험으로 인해 코드의 일부를 다시 작성해야 할 수도 있습니다. 코드를 다시 작성하면 시간과 비용이 듭니다.

업데이트 접근 방식

.NET 개발자는 원하는 업데이트 동작을 .NET에 알릴 수 있습니다. 위험 측면에서 업데이트를 생각해 볼 때 다음과 같은 접근 방식이 있습니다.

  • 주 버전: 출시되자마자 최신 주 버전으로 업데이트해도 괜찮습니다. 개발자 자신이 코드를 변경해야 할 수도 있다는 사실에 동의합니다.
  • 부 버전: 새 기능을 추가해도 괜찮습니다. 코드가 손상되는 것은 괜찮지 않습니다.
  • 패치 버전: 괜찮은 업데이트는 버그 수정뿐입니다.

신규 또는 비교적 작은 .NET 프로젝트를 관리하는 경우 조금 느슨하게 업데이트 전략을 정의해도 됩니다. 예를 들어 항상 최신 버전으로 업데이트할 수 있습니다. 더 복잡한 프로젝트의 경우 더 많은 사항을 고려해야 하지만, 해당 내용은 이후 모듈에서 살펴보겠습니다.

일반적으로 업데이트하는 종속성이 작을수록 포함된 종속 항목이 적고 업데이트 프로세스가 쉬울 가능성이 높습니다.

업데이트를 위해 프로젝트 파일 구성

하나 이상의 종속성을 추가하는 경우에는 프로젝트를 복원, 빌드, 실행할 때 예측 가능한 동작을 얻을 수 있도록 프로젝트 파일을 구성하세요. 패키지에 적용하려는 접근 방식을 알릴 수 있습니다. NuGet에는 버전 범위유동적인 버전이라는 개념이 있습니다.

버전 범위는 확인하려는 특정 버전의 범위를 나타내는 데 사용할 수 있는 특수 표기법입니다.

표기법 적용된 규칙 설명
1.0 x >= 1.0 최소 버전(포함)
(1.0,) x > 1.0 최소 버전(제외)
[1.0] x == 1.0 정확한 버전 일치
(,1.0] x ≤ 1.0 최대 버전(포함)
(,1.0) x < 1.0 최대 버전(제외)
[1.0,2.0] 1.0 ≤ x ≤ 2.0 정확한 범위(포함)
(1.0,2.0) 1.0 < x < 2.0 정확한 범위(제외)
[1.0,2.0) 1.0 ≤ x < 2.0 최소 포함 및 최대 제외 혼합 버전
(1.0) 잘못됨 잘못됨

NuGet은 번호의 주, 부, 패치 및 시험판 접미사 부분에 유동적인 버전 표기법도 사용할 수 있도록 지원합니다. 이 표기법은 별표(*)입니다. 예를 들어 버전 사양 6.0.*는 "최신 6.0.x 버전 사용"을 의미하고 4.*는 "최신 4.x 버전 사용"을 의미합니다. 유동적인 버전을 사용하면 최신 버전의 종속성을 최신으로 유지하면서 프로젝트 파일의 변경을 줄입니다.

참고

유동적인 표기법을 사용하는 대신 특정 버전을 설치하는 것이 좋습니다. 특정 버전을 설치하면 종속성의 업데이트를 명시적으로 요청하지 않는 경우 빌드를 반복하는 것이 가능합니다.

유동적인 버전을 사용하는 경우 NuGet은 버전 패턴과 일치하는 패키지의 최신 버전을 확인합니다. 다음 예제에서 6.0.*는 6.0으로 시작하는 패키지의 최신 버전을 가져옵니다. 해당 버전은 6.0.1입니다.

유동적인 버전 요청 시 최신 버전 선택을 보여 주는 다이어그램.

주, 부 또는 패치 버전에 구성할 수 있는 몇 가지 예는 다음과 같습니다.

<!-- Accepts any version 6.1 and later. -->
<PackageReference Include="ExamplePackage" Version="6.1" />

<!-- Accepts any 6.x.y version. -->
<PackageReference Include="ExamplePackage" Version="6.*" />
<PackageReference Include="ExamplePackage" Version="[6,7)" />

<!-- Accepts any later version, but not including 4.1.3. Could be
     used to guarantee a dependency with a specific bug fix. -->
<PackageReference Include="ExamplePackage" Version="(4.1.3,)" />

<!-- Accepts any version earlier than 5.x, which might be used to prevent pulling in a later
     version of a dependency that changed its interface. However, we don't recommend this form because determining the earliest version can be difficult. -->
<PackageReference Include="ExamplePackage" Version="(,5.0)" />

<!-- Accepts any 1.x or 2.x version, but not 0.x or 3.x and later. -->
<PackageReference Include="ExamplePackage" Version="[1,3)" />

<!-- Accepts 1.3.2 up to 1.4.x, but not 1.5 and later. -->
<PackageReference Include="ExamplePackage" Version="[1.3.2,1.5)" />

오래된 패키지 찾기 및 업데이트

dotnet list package --outdated 명령은 오래된 패키지를 나열합니다. 이 명령을 사용하면 최신 버전의 패키지를 사용할 수 있는 시기를 알 수 있습니다. 명령의 출력은 일반적으로 다음과 같습니다.

Top-level Package      Requested   Resolved   Latest
> Humanizer            2.7.*       2.7.9      2.8.26

출력에 나오는 열 이름의 의미는 다음과 같습니다.

  • Requested: 지정한 버전 또는 버전 범위입니다.
  • Resolved: 지정된 버전과 일치하는 프로젝트에 대해 다운로드된 실제 버전입니다.
  • Latest: NuGet에서 업데이트용으로 사용 가능한 최신 버전입니다.

권장되는 워크플로는 다음 순서대로 이 명령을 실행하는 것입니다.

  1. dotnet list package --outdated을 실행합니다. 이 명령은 오래된 패키지를 모두 나열합니다. Requested, Resolved, Latest 열에 정보를 제공합니다.
  2. dotnet add package <package name>을 실행합니다. 이 명령을 실행하는 경우 최신 버전으로 업데이트를 시도합니다. 선택적으로 --version=<version number/range>에 전달할 수 있습니다.