프로그래밍/C#, .NET

[.NET 6] '버전 자동 증가' 설정하고 버전 정보를 시간으로 치환하기

당근천국 2022. 9. 21. 15:30

닷넷 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/

 

뭔가......

어느 순간 보면 닷넷에서 버전관리 하는 방법이 달라진 거 같습니다?

 

덕분에 닷넷에서 버전을 자동으로 커스텀 하는 것이 엄청 귀찮아졌지만

그나마 다행인건 버전 정보에서 날짜 정보를 받을 수 있다는 점입니다.