즐겁게 개발을...

개발보다 게임이 더 많이 올라오는 것 같은...

개발/C#

[2022.09] 버전 관리의 고찰

다물칸 2022. 9. 29. 16:48
728x90
반응형

기본 프로젝트를 생성하면 "1.0.0.0"으로 빌드된다. 차례대로 Major, Minor, Build, Revision이라는데 예전 VB 6.0 시절로 되돌아가면 빌드할 때마다 리비전 번호를 자동 증가시켜서 빌드할 때마다 아무짓 하지 않아도 배포될 때 해당 리비전 이력만 관리하면 됐었는데 요즘 VS에서는 안된다. 

 

 

[C#] Version 자동 설정 및 BuildDateTime 구하기

Assembly의 Build된 일시를 구하기 위한 방법을 설명 드립니다. 먼저 [Properties] 폴더에 [AssemblyInf.cs]를 엽니다. 다음과 같은 부분을 찾습니다. 보통 최 하단에 위치하고 있습니다. // You can specify all..

nsinc.tistory.com

요런 게 있다. 

 

프로젝트 밑에 Properties 밑에 Assemblyinfo.cs 파일이 있다. 그 파일을 열고 마지막 줄로 내리면 아래와 같은 정보가 있다. 

// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다.
//
//      주 버전
//      부 버전 
//      빌드 번호
//      수정 버전
//
// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를
// 기본값으로 할 수 있습니다.
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

주석으로 자세하게 설명된 것과 샘플처럼 변경하면 빌드번호와 수정버전을 자동처리 된다는 것을 알 수 있다. 자세한 내용은 출처에서 읽어보도록 하고 이를 이용하여 필자는 3가지 버전타입으로 표시하도록 하였다. 

 

자동으로 처리되는 버전은 개발자 입장에서 세부적으로 관리하기 쉽지만 엔지니어가 보기에 복잡하기 때문에 관리하기가 쉽지 않다. AssemblyFileVersion은 자동설정이 되지 않기 때문에 배포 빌드할 때 마다 기존처럼 하드코딩(전체 바꾸기 신공을 이용)하여 변경되는 버전을 서비스 관리용도로 사용하면 될 것이다. 그리고 또 하나, 솔루션을 개발하면 인허가를 받을 수 있는데 보통 제품버전 2자리까지 Fix가 된다. 인허가 용 버전도 필요하다. 

 

AssemblyFileVersion은 다행히도 Application.ProductVersion 으로 가져올 수 있다. 

 

public enum APP_VERSION
{
    SIMPLE, // 인허가용
    BUILD,  // 개발자용
    RELEASE // 사용자 및 엔지니어용
}

public static string ProcGetAppVer(APP_VERSION appVer)        
{
    Assembly assemObj = Assembly.GetExecutingAssembly();
    Version v = assemObj.GetName().Version;

    string strRet = string.Empty;
    switch (appVer)
    {
        case APP_VERSION.BUILD:
            strRet = String.Format("{0}.{1:C2}.{2}.{3} ({4})", v.Major.ToString(), v.Minor.ToString(), v.Build.ToString(), v.Revision.ToString(), Get_BuildDateTime(v).ToString("yyyyMMdd"));
            break;
        case APP_VERSION.RELEASE:
            strRet = String.Format("{0} ({1})", Application.ProductVersion, Get_BuildDateTime(v).ToString("yyyyMMdd"));
            break;
        default:
            strRet = String.Format("{0}.{1:c2}", v.Major.ToString(), v.Minor.ToString());
            break;
    }
    return strRet;
}

/// <summary>
/// 버전 정보를 넣으면 빌드 시간을 반환. (1.0.* 로 설정했을 때 빌드시간을 가져오는 함수)
/// </summary>
/// <param name="version"></param>
/// <returns></returns>
public static System.DateTime Get_BuildDateTime(System.Version version = null)
{
    // 주.부.빌드.수정
    // 주 버전    Major Number
    // 부 버전    Minor Number
    // 빌드 번호  Build Number
    // 수정 버전  Revision NUmber

    //매개 변수가 존재할 경우
    if (version == null)
        version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;

    //세번째 값(Build Number)은 2000년 1월 1일부터
    //Build된 날짜까지의 총 일(Days) 수 이다.
    int day = version.Build;
    System.DateTime dtBuild = (new System.DateTime(2000, 1, 1)).AddDays(day);

    //네번째 값(Revision NUmber)은 자정으로부터 Build된
    //시간까지의 지나간 초(Second) 값 이다.
    int intSeconds = version.Revision;
    intSeconds = intSeconds * 2;
    dtBuild = dtBuild.AddSeconds(intSeconds);

    //시차 보정
    System.Globalization.DaylightTime daylingTime = System.TimeZone.CurrentTimeZone
            .GetDaylightChanges(dtBuild.Year);
    if (System.TimeZone.IsDaylightSavingTime(dtBuild, daylingTime))
        dtBuild = dtBuild.Add(daylingTime.Delta);

    return dtBuild;
}

 

 

반응형