버전 관리
소프트웨어 라이브러리가 버전 1.0에서 완성되는 경우는 거의 없습니다. 유용한 라이브러리는 시간이 지남에 따라 발전하며 기능을 추가하고, 버그를 수정하며, 성능을 개선합니다. 기존 사용자를 중단하지 않고 각 버전에서 추가 가치를 제공하여 .NET 라이브러리의 새 버전을 릴리스하는 것이 중요합니다.
호환성이 손상되는 변경
버전 간의 호환성이 손상되는 변경 처리에 대한 자세한 내용은 호환성이 손상되는 변경을 참조하세요.
버전 번호
.NET 라이브러리에는 버전을 지정하는 여러 가지 방법이 있습니다. 가장 중요한 버전은 다음과 같습니다.
NuGet 패키지 버전
NuGet 패키지 버전은 Visual Studio NuGet 패키지 관리자인 NuGet.org에 표시되고 패키지를 사용할 때 소스 코드에 추가됩니다. NuGet 패키지 버전은 사용자에게 일반적으로 표시되는 버전 번호이며, 사용 중인 라이브러리 버전을 말할 때는 이 버전을 가리킵니다. NuGet 패키지 버전은 NuGet에서 사용되며 런타임 동작에는 영향을 미치지 않습니다.
<PackageVersion>1.0.0-alpha1</PackageVersion>
NuGet 패키지 식별자와 NuGet 패키지 버전을 결합하여 NuGet에서 패키지를 식별합니다. 예들 들어 Newtonsoft.Json
+ 11.0.2
입니다. 접미사가 있는 패키지는 시험판 패키지이며, 테스트에 적합하게 하는 특수 동작이 있습니다. 자세한 내용은 시험판 패키지를 참조하세요.
NuGet 패키지 버전은 개발자가 가장 보기 쉬운 버전이므로 SemVer(유의적 버전)를 사용하여 업데이트하는 것이 좋습니다. SemVer는 릴리스 간 변경 내용의 중요도를 나타내며, 개발자가 사용할 버전을 선택할 때 정확하고 합리적으로 결정할 수 있도록 지원합니다. 예를 들어 1.0
에서 2.0
으로 이동하는 경우 호환성이 손상되는 변경이 있을 수 있습니다.
✔️ 고려 SemVer 2.0.0을 사용하여 NuGet 패키지 버전을 관리합니다.
✔️ 사용자에게 일반적으로 표시되는 버전 번호인 NuGet 패키지 버전을 공용 문서에서 사용합니다.
✔️ 불안정한 패키지를 릴리스할 때는 시험판 접미사를 포함합니다.
사용자는 시험판 패키지를 가져오기 위해 옵트인해야 하므로 패키지가 불완전함을 알 수 있습니다.
어셈블리 버전
어셈블리 버전은 CLR에서 런타임 시 로드할 어셈블리 버전을 선택하는 데 사용하는 버전입니다. 버전 관리를 사용한 어셈블리 선택은 강력한 이름의 어셈블리에만 적용됩니다.
<AssemblyVersion>1.0.0.0</AssemblyVersion>
.NET Framework CLR에서는 정확히 일치해야 강력한 이름의 어셈블리를 로드할 수 있습니다. 예를 들어 Library1, Version=1.0.0.0
은 Newtonsoft.Json, Version=11.0.0.0
을 참조하여 컴파일되었습니다. .NET Framework는 정확한 버전인 11.0.0.0
만 로드합니다. 런타임 시 다른 버전을 로드하려면 .NET 애플리케이션의 구성 파일에 바인딩 리디렉션을 추가해야 합니다.
강력한 이름 지정과 어셈블리 버전을 결합하면 엄격한 어셈블리 버전 로드를 사용할 수 있습니다. 라이브러리에 강력한 이름을 지정하면 여러 가지 혜택이 있지만, 어셈블리를 찾을 수 없는 런타임 예외가 자주 발생하며 app.config
또는 web.config
의 바인딩 리디렉션을 수정해야 합니다. .NET Core에서는 어셈블리 로드가 더 완화됩니다. .NET Core 런타임에서는 런타임에 더 높은 버전의 어셈블리를 자동으로 로드합니다.
✔️ AssemblyVersion에 주 버전만 포함하는 것을 고려하세요.
예를 들어 라이브러리 1.0과 라이브러리 1.0.1은 모두 AssemblyVersion이
1.0.0.0
이고 라이브러리 2.0은 AssemblyVersion이2.0.0.0
입니다. 어셈블리 버전의 변경 빈도가 낮으면 바인딩 리디렉션이 줄어듭니다.
✔️ AssemblyVersion의 주 버전 번호와 NuGet 패키지 버전을 동기화 상태로 유지하는 것을 고려하세요.
AssemblyVersion은 사용자에게 표시되는 일부 정보 메시지(예: 예외 메시지의 어셈블리 이름 및 어셈블리 정규화 형식 이름)에 포함됩니다. 버전 간의 관계를 유지 관리하면 사용 중인 버전에 대한 자세한 정보가 개발자에게 제공됩니다.
❌ 고정된 AssemblyVersion을 사용하지 마세요.
AssemblyVersion이 변경되지 않는 경우 바인딩 리디렉션이 필요하지 않지만, 단일 어셈블리 버전만 GAC(전역 어셈블리 캐시)에 설치할 수 있습니다. 또한 다른 애플리케이션이 GAC 어셈블리를 호환성이 손상되는 변경으로 업데이트하는 경우 GAC에 있는 어셈블리를 참조하는 애플리케이션이 손상됩니다.
어셈블리 파일 버전
어셈블리 파일 버전은 Windows에서 파일 버전을 표시하는 데 사용되며 런타임 동작에는 영향을 미치지 않습니다. 이 버전 설정은 선택 사항입니다. Windows 탐색기의 파일 속성 대화 상자에 표시됩니다.
<FileVersion>11.0.2.21924</FileVersion>
✔️ 연속 통합 빌드 번호를 AssemblyFileVersion 수정으로 포함하는 것을 고려하세요.
예를 들어 프로젝트 버전 1.0.0을 빌드 중이며 연속 통합 빌드 번호가 99인 경우 AssemblyFileVersion은 1.0.0.99입니다.
✔️ 파일 버전에 대해 Major.Minor.Build.Revision
형식을 사용합니다.
.NET에서는 파일 버전을 사용하지 않지만 Windows에서는 파일 버전이
Major.Minor.Build.Revision
형식이어야 합니다. 버전이 이 형식을 따르지 않으면 경고가 발생합니다.
어셈블리 정보 버전
어셈블리 정보 버전은 추가 버전 정보를 기록하는 데 사용되며 런타임 동작에는 영향을 미치지 않습니다. 이 버전 설정은 선택 사항입니다. 소스 링크를 사용하는 경우 이 버전은 NuGet 패키지 버전과 소스 제어 버전을 사용하여 빌드에서 설정됩니다. 예를 들어 1.0.0-beta1+204ff0a
는 어셈블리 빌드에 사용된 소스 코드의 커밋 해시를 포함합니다. 자세한 내용은 소스 링크를 참조하세요.
<InformationalVersion>The quick brown fox jumped over the lazy dog.</InformationalVersion>
참고 항목
이 버전이 Major.Minor.Build.Revision
형식을 따르지 않으면 이전 버전의 Visual Studio에서는 빌드 경고가 발생합니다. 경고는 무시해도 됩니다.
❌ 어셈블리 정보 버전을 직접 설정하지 않습니다.
SourceLink에서 NuGet 및 소스 제어 메타데이터가 포함된 버전을 자동으로 생성하도록 허용합니다.
.NET