문제

각 빌드마다 내 애플리케이션의 버전 속성을 증가시키고 싶지만 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 기사.

어셈블리 버전은 어셈블리인포.vb 또는 어셈블리인포.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

[비주얼 스튜디오 2017, .csproj 속성]

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

major.minor 번호를 수동으로 업데이트하지만 MSBuild가 빌드 번호(1.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 프로세스에서 작업을 호출하여 .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\nuget NuGet 클라이언트가 있는 곳입니다. 호출하여 NuGet API 키를 저장해야 합니다. nuget SetApiKey <my-api-key> 또는 NuGet 푸시 호출에 키를 포함합니다.

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

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

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

컴파일이 완료될 때마다 업데이트되는 자동 증가 숫자를 원하는 경우 다음을 사용할 수 있습니다. 버전 업데이터 사전 빌드 이벤트에서.예를 들어 릴리스 빌드에 대해서만 버전 번호가 증가하도록 사전 빌드 이벤트에서 빌드 구성을 확인할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top