[c#] 버전 번호 자동 업데이트

내 응용 프로그램의 버전 속성을 각 빌드마다 증가시키고 싶지만 Visual Studio (2005/2008)에서이 기능을 활성화하는 방법을 잘 모르겠습니다. AssemblyVersion을 1.0. *로 지정하려고했지만 원하는 것을 정확히 얻지 못했습니다.

또한 설정 파일을 사용하고 있으며 이전 시도에서 어셈블리 버전이 변경되었을 때 응용 프로그램이 다른 디렉터리에서 설정 파일을 찾았 기 때문에 설정이 기본값으로 재설정되었습니다.

버전 번호를 1.1.38 형식으로 표시하여 사용자가 문제를 발견하면 사용중인 버전을 기록하고 이전 버전이있는 경우 업그레이드하도록 지시 할 수 있기를 바랍니다.

버전 관리가 어떻게 작동하는지에 대한 간단한 설명도 감사하겠습니다. 빌드 및 개정 번호는 언제 증가합니까?



답변

“내장”항목으로는 불가능합니다. 1.0. * 또는 1.0.0. *을 사용하면 개정 및 빌드 번호가 코드화 된 날짜 / 타임 스탬프로 대체되므로 일반적으로 좋은 방법입니다.

자세한 내용은 어셈블리 링커를 참조하세요. 은 / v 태그 설명서를 .

자동으로 숫자를 늘리려면 AssemblyInfo 태스크를 사용하십시오.

AssemblyInfo 작업

빌드 번호를 자동으로 늘리도록 구성 할 수 있습니다.

2 가지 고차가 있습니다.

  1. 버전 문자열의 4 개 숫자는 각각 65535로 제한됩니다. 이는 Windows 제한 사항이며 수정 될 가능성이 낮습니다.
  2. Subversion과 함께 사용하려면 약간의 변경이 필요합니다.

버전 번호를 검색하는 것은 매우 쉽습니다.

Version v = Assembly.GetExecutingAssembly().GetName().Version;
string About = string.Format(CultureInfo.InvariantCulture, @"YourApp Version {0}.{1}.{2} (r{3})", v.Major, v.Minor, v.Build, v.Revision);

그리고 명확히하기 위해 : .net 또는 적어도 C #에서 빌드는 실제로 세 번째 번호이며 일부 사람들 (예 : Major.Minor.Release.Build에 익숙한 Delphi 개발자)이 예상 할 수있는 네 번째 번호가 아닙니다.

.net에서는 Major.Minor.Build.Revision입니다.


답변

VS.NET은 어셈블리 버전을 1.0. *로 기본 설정하고 자동 증분시 다음 논리를 사용합니다. 빌드 부분을 2000 년 1 월 1 일 이후의 일 수로 설정하고 수정 부분을 자정 이후의 시간 (초)으로 설정합니다. 현지 시간을 2로 나눈 값입니다. 이 MSDN 문서를 참조하십시오 .

어셈블리 버전은 assemblyinfo.vb 또는 assemblyinfo.cs 파일에 있습니다. 파일에서 :

' Version information for an assembly consists of the following four values:
'
'      Major Version
'      Minor Version 
'      Build Number
'      Revision
'
' You can specify all the values or you can default the Build and Revision Numbers 
' by using the '*' as shown below:
' <Assembly: AssemblyVersion("1.0.*")> 

<Assembly: AssemblyVersion("1.0.0.0")>
<Assembly: AssemblyFileVersion("1.0.0.0")> 


답변

제품 버전이 필요할 때마다 다음을 사용하여 마지막 빌드 날짜를 표시하는 것이 잘 작동 함을 발견했습니다.

System.IO.File.GetLastWriteTime(System.Reflection.Assembly.GetExecutingAssembly().Location).ToString("yyyy.MM.dd.HH.mm.ss")

다음과 같은 것에서 버전을 가져 오려고 시도하는 대신 :

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
object[] attributes = assembly.GetCustomAttributes(typeof(System.Reflection.AssemblyFileVersionAttribute), false);
object attribute = null;

if (attributes.Length > 0)
{
    attribute = attributes[0] as System.Reflection.AssemblyFileVersionAttribute;
}


답변

어떤 소스 제어 시스템을 사용하고 있습니까?

거의 모든 파일에는 파일이 체크인 될 때 ​​확장되는 $ Id $ 태그 형식이 있습니다.

나는 보통 이것을 버전 번호로 표시하기 위해 어떤 형태의 해커 리를 사용합니다.

다른 대안은 날짜를 빌드 번호로 사용하는 것입니다 : 080803-1448


답변

[Visual Studio 2017, .csproj 속성]

PackageVersion / Version / AssemblyVersion 속성 (또는 기타 속성)을 자동으로 업데이트하려면 먼저 새 Microsoft.Build.Utilities.Task 현재 빌드 번호를 가져올 클래스를 업데이트 된 번호를 다시 보냅니다 (해당 클래스에 대해서만 별도의 프로젝트를 만드는 것이 좋습니다).

수동으로 major.minor 번호를 업데이트하지만 MSBuild가 빌드 번호 (1.1. 1 , 1.1. 2 , 1.1. 3 등) 를 자동으로 업데이트하도록합니다 . 🙂

using Microsoft.Build.Framework;
using System;
using System.Collections.Generic;
using System.Text;

public class RefreshVersion : Microsoft.Build.Utilities.Task
{
    [Output]
    public string NewVersionString { get; set; }
    public string CurrentVersionString { get; set; }

    public override bool Execute()
    {
        Version currentVersion = new Version(CurrentVersionString ?? "1.0.0");

        DateTime d = DateTime.Now;
        NewVersionString = new Version(currentVersion.Major,
            currentVersion.Minor, currentVersion.Build+1).ToString();
        return true;
    }

}

그런 다음 MSBuild 프로세스에서 최근에 만든 Task를 호출하여 .csproj 파일에 다음 코드를 추가합니다.

<Project Sdk="Microsoft.NET.Sdk">
...
<UsingTask TaskName="RefreshVersion" AssemblyFile="$(MSBuildThisFileFullPath)\..\..\<dll path>\BuildTasks.dll" />
<Target Name="RefreshVersionBuildTask" BeforeTargets="Pack" Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
   <RefreshVersion CurrentVersionString="$(PackageVersion)">
          <Output TaskParameter="NewVersionString" PropertyName="NewVersionString" />
   </RefreshVersion>
   <Message Text="Updating package version number to $(NewVersionString)..." Importance="high" />
   <XmlPoke XmlInputPath="$(MSBuildProjectDirectory)\mustache.website.sdk.dotNET.csproj" Query="/Project/PropertyGroup/PackageVersion" Value="$(NewVersionString)" />
</Target>
...
<PropertyGroup>
 ..
 <PackageVersion>1.1.4</PackageVersion>
 ..

Visual Studio Pack 프로젝트 옵션을 선택하면 ( BeforeTargets="Build"빌드 전에 작업을 실행 하기 위해로 변경 ) RefreshVersion 코드가 트리거되어 새 버전 번호를 계산하고 XmlPoke그에 따라 작업이 .csproj 속성을 업데이트합니다 (예, 파일을 수정합니다).

NuGet 라이브러리로 작업 할 때 이전 예제에 다음 빌드 작업을 추가하기 만하면 패키지를 NuGet 리포지토리로 보냅니다.

<Message Text="Uploading package to NuGet..." Importance="high" />
<Exec WorkingDirectory="$(MSBuildProjectDirectory)\bin\release" Command="c:\nuget\nuget push *.nupkg -Source https://www.nuget.org/api/v2/package" IgnoreExitCode="true" />

c:\nuget\nugetNuGet 클라이언트가있는 곳입니다 ( nuget SetApiKey <my-api-key>NuGet 푸시 호출에 키를 포함하거나 호출하여 NuGet API 키를 저장해야 함 ).

누군가에게 도움이된다면 ^ _ ^.


답변

얼마 전에 저는 assemblyinfo. {cs / vb}에서 버전 번호를 업데이트하는 빠르고 더러운 exe를 작성했습니다.-또한 rxfind.exe (간단하고 강력한 정규식 기반 검색 대체 도구)를 사용하여 빌드 프로세스의 일부로 명령 줄에서 업데이트합니다. 몇 가지 다른 유용한 힌트 :

  1. 어셈블리 정보를 제품 부품 (회사 이름, 버전 등)과 어셈블리 특정 부품 (어셈블리 이름 등)으로 분리합니다. 여기를 참조 하십시오
  2. 또한-저는 Subversion을 사용하므로 빌드 번호를 Subversion 개정 번호로 설정하는 것이 도움이되므로 어셈블리를 생성 한 코드베이스로 항상 쉽게 돌아갈 수 있습니다 (예 : 1.4.100.1502는 개정판 1502에서 빌드 됨).

답변

컴파일이 완료 될 때마다 업데이트되는 자동 증분 번호를 원하는 경우 빌드 전 이벤트에서 VersionUpdater 를 사용할 수 있습니다 . 사전 빌드 이벤트는 원하는 경우 빌드 구성을 확인할 수 있으므로 버전 번호가 릴리스 빌드에 대해서만 증가합니다 (예 :).