버전 번호 자동 업데이트


108

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

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

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

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


다음 질문에는 빌드 이벤트에서 소스 파일을 생성하여 애플리케이션에 빌드 번호를 삽입하는 방법에 대한 간단하고 편리한 솔루션이 있습니다. stackoverflow.com/questions/4450231/…
Ashley Davis

답변:


96

"내장"항목으로는 불가능합니다. 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입니다.


3
방금 비슷한 작업을 수행하는이 Visual Studio 추가 기능을 찾았습니다. autobuildversion.codeplex.com
jrsconfitto

6
2179 년 6 월 4 일에 Microsoft 기본 버전 번호가 중단된다는 의미입니까? (2000 년 이후 65536 일)
Lloyd Powell

1
@Jugglingnutcase-현재 버전의 비주얼 스튜디오에서 작동한다면 링크는 거의 완벽 할 것입니다.
Kraang Prime

2
@SanuelJackson 하하! 네. 너무 나쁘다 2010 년에 내 의견을 따라 가지 못해 죄송합니다! : P 시간과 버전의 행진은 우리 모두를 슬프게합니다.
jrsconfitto

@Michael Stum : 답변에서 AssemblyInfo Task 의 링크를 업데이트 해 주 시겠습니까? 나를 위해 올바르게로드되지 않습니다.
Matt

22

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")> 

초기 날짜를 포함 해 주셔서 감사합니다 :January 1st, 2000
kiewic

11

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

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;
}

6
나는 당신이 이것을 의미한다고 생각합니다 : yyyy.MM.dd.HHMM이 아닌 yyyy.MM.dd.HHmm.
JHubbard80 2013

1
이것은 어셈블리 파일 변경에 어떤 종류의 버전 번호를 첨부하는 가장 간단한 솔루션입니다.
Alexei

6

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

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

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

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


"거의 모든 파일이 파일을 체크인 할 때 확장되는 $ Id $ 태그의 형식을 가지고 있습니다."에서 확장 할 수 있습니까? 구체적으로, 전복에 대해 알고 있습니까?
Greg B

3

[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 키를 저장해야 함 ).

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


1

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

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

코드 파일 ( .cs / .vb) 용인 경우 대신 T4 템플릿을 사용해야합니다.
BrainSlugs83

0

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


흥미 롭군. 나는 같은 이름을 가진 년 동안 내 자신을 했어 (난 그냥 최근에 온라인으로 넣어하지만) 하나가 존재 몰랐 : github.com/rjamesnw/VersionUpdater
제임스 윌킨스에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.