[.NET 6] '버전 자동 증가' 설정하고 버전 정보를 시간으로 치환하기
닷넷 5 이후 버전(기억이 맞나....) 부터는 버전 관리 인터페이스가 바뀌었습니다.
간단하게 '버전 자동 증가' 설정 방법을 다루고
이 정보를 시간으로 치환해보겠습니다.
1. '버전 자동 증가' 설정하기
이전 버전에서는 프로젝트를 생성하면
'AssemblyInfo.cs'파일이 생성되고
빌드할 때 합쳐졌습니다.
이제는 프로젝트 파일(.csproj)에 정보가 기록되어 있다가
빌드할 때 'AssemblyInfo.cs'파일이 생성됩니다.
그래서 직접 'AssemblyInfo.cs'를 수정하면 안 됩니다.
1-1. 버전에 와일드카드(wildcard) 사용하기
예전 포스팅에서도 다뤘던 내용입니다.
(참고 : [.NET] 버전 자동 증가(변경) 기능 켜기 )
버전 정보에 와일드카드를 사용할 수 있습니다.
이것을 이용해 빌드 때마다 다른 버전번호를 사용할 수 있습니다.
프로젝트 속성 > 패키지 > 일반
에 있는 어셈블리 버전을 "1.0.*"로 바꿔줍니다.
1-2. '결정적' 옵션 끄기
'결정적' 옵션이 켜져 있으면 버전 정보에 와일드카드를 쓸 수 없습니다.
(참고 : MSDN - 코드 생성을 제어하는 C# 컴파일러 옵션 : 결정적)
솔루션 탐색기 > 프로젝트 더블 클릭
'PropertyGroup'속성의 자식으로 아래 옵션을 추가합니다.
<Deterministic>false</Deterministic>
1-3. 파일정보에는 안 나온다?
어셈블리 버전(Assembly Version)은 파일정보에 나오지 않습니다.
아래 코드로 버전을 확인할 수 있습니다.
//이 프로그램의 어셈블리 정보
Assembly assembly = Assembly.GetExecutingAssembly();
//어셈블리 이름 정보
AssemblyName name = assembly.GetName();
string sVer = name.Version.ToString();
2. 버전 정보를 시간으로 치환하기
다행히도 자동으로 생성된 버전 정보는 룰이 있습니다.
(참고 : stackoverflow - AssemblyVersion using * fails with error "wildcards, which are not compatible with determinism?" 의 "John Deer"님 답변)
2-1. '버전 자동 증가' 규칙
3번째 자리는 '2000-01-01'을 기준으로 추가된 날짜 수입니다.
'2000-01-02'이라면 '0001'입니다.
'8298'은 '2022-09-20' 입니다.
4번째 자리는 하루기준 초의 절반입니다.
하루의 초는 '86400'인데 이것의 절반인 '43200'입니다.
그래서 초로 계산하려면 곱하기 2를 해야 합니다.
즉, '32434'는 '64,868'초라는 것이고
'18:01:08'이 됩니다.
2-2. 계산하기
닷넷의 'DateTime'를 이용하면 쉽게 계산할 수 있습니다.
//이 프로그램의 어셈블리 정보
Assembly assembly = Assembly.GetExecutingAssembly();
//어셈블리 이름 정보
AssemblyName name = assembly.GetName();
DateTime dtVersion
= new DateTime(2000, 1, 1)
.AddDays(name.Version!.Build)
.AddSeconds(name.Version.Revision * 2);
sbOut.AppendLine("Version : " + name.Version);
sbOut.AppendLine("Date time : " + dtVersion);
3. 파일 정보 읽기
파일 정보를 읽어 버전 정보나 시간을 체크하는 방법도 있습니다.
//이 프로그램의 파일 정보
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
FileInfo fi = new FileInfo(assembly.Location);
sbOut.AppendLine("Version : " + fvi.FileVersion);
sbOut.AppendLine("Date time : " + fi.LastWriteTime);
이게 파일 수정날짜라 빌드날짜와 안 맞을 수 있습니다.
4. 버전 정보 개체
'AssemblyName.Version'은 'Version' 클래스입니다.
(참고 : MSDN - Version 클래스 )
이 클래스의 정보는
Major. Minor. Build. Revision
으로 되어 있습니다.
Version.Major
- MSDN - Version.Major 속성
- 주 버전
Version.Minor
- MSDN - Version.Minor 속성
- 부 버전
Version.Build
- MSDN - Version.Build 속성
- 빌드 버전
Version.Revision
- MSDN - Version.Revision 속성
- 수정 버전 번호
버전 정보에 관한 자세한 내용은
참고 : andrewlock.net의 Andrew Lock님 - Version vs VersionSuffix vs PackageVersion: What do they all mean?
마무리
테스트 프로젝트 : github - dang-gun/DotNetSamples/VersionTest/
뭔가......
어느 순간 보면 닷넷에서 버전관리 하는 방법이 달라진 거 같습니다?
덕분에 닷넷에서 버전을 자동으로 커스텀 하는 것이 엄청 귀찮아졌지만
그나마 다행인건 버전 정보에서 날짜 정보를 받을 수 있다는 점입니다.