자동 증분 버전 번호를 얻는 방법 (Visual Studio)?
이 질문에는 이미 답변이 있습니다.
빌드시 자동 증가하는 정수 세트를 저장하고 싶습니다.
int MajorVersion = 0;
int MinorVersion = 1;
int Revision = 92;
컴파일 할 때 자동 증가 Revision
합니다. 설정 프로젝트를 빌드하면 증가합니다 MinorVersion
(수동으로 수행해도 괜찮습니다). MajorVersion
수동으로 만 증분됩니다.
그런 다음 메뉴 도움말 / 정보에 버전 번호를 다음과 같이 표시 할 수 있습니다.
버전 : 0.1.92
이것이 어떻게 달성 될 수 있습니까?
이 질문은 자동 증가 버전 번호를 얻는 방법뿐만 아니라 다른 사람보다 더 완전한 답변 인 코드에서 사용하는 방법을 묻습니다.
프로젝트에 AssemblyInfo 클래스를 추가하고 별표로 끝나도록 AssemblyVersion 속성을 수정하는 경우 (예 :
[assembly: AssemblyVersion("2.10.*")]
Visual Studio는 이 규칙 에 따라 최종 수를 늘릴 것입니다 (감사합니다, 완전히 잘못되었습니다!)
코드에서이 버전을 참조하기 위해 사용자에게 표시 할 수 있도록 리플렉션을 사용합니다. 예를 들어
Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
DateTime buildDate = new DateTime(2000, 1, 1)
.AddDays(version.Build).AddSeconds(version.Revision * 2);
string displayableVersion = $"{version} ({buildDate})";
알아야 할 두 가지 중요한 문제
@ ashes999에서 :
또한 두 경우 있음을 주목할 필요가 AssemblyVersion
와가 AssemblyFileVersion
지정되어, 당신이 당신의 .EXE에이 표시되지 않습니다.
@ BrainSlugs83에서 :
*
버전이 항상 증가하지는 않으므로 4 번째 숫자 만 설정하는 것은 좋지 않습니다. 세 번째 숫자는 2000 년 이후의 일 수이고, 네 번째 숫자는 자정 이후의 초 수입니다 (2로 나눔). [IT IS NOT RANDOM]. 따라서 하루 늦게 솔루션을 빌드하고 다음 날 늦게 솔루션을 빌드하면 나중에 빌드 할 때 버전 번호가 더 빠릅니다. 버전 번호는 항상이 방법으로 증가하므로 항상 X.Y.*
대신 사용 하는 것이 좋습니다 X.Y.Z.*
.
Visual Studio에서 T4 템플릿 메커니즘을 사용하여 간단한 텍스트 파일에서 필요한 소스 코드를 생성 할 수 있습니다 .
일부 .NET 프로젝트의 버전 정보 생성을 구성하고 싶었습니다. 사용 가능한 옵션을 조사한 지 오랜 시간이 걸렸으므로 간단한 방법을 찾기 위해 주변을 검색했습니다. 내가 찾은 것은 매우 고무적인 것처럼 보이지 않았습니다. 사람들은 Visual Studio 추가 기능과 사용자 지정 MsBuild 작업을 작성하여 하나의 정수 (아마도, 아마도 2)를 얻습니다. 이것은 작은 개인 프로젝트에 대한 잔인 함을 느꼈습니다.
누군가가 T4 템플릿이 작업을 수행 할 수 있다고 제안한 StackOverflow 토론 중 하나에서 영감을 얻었습니다. 물론 그들은 할 수 있습니다. 이 솔루션은 최소한의 노력으로 Visual Studio 또는 빌드 프로세스 사용자 지정이 필요하지 않습니다. 여기서해야 할 일 :
- 확장자가 ".tt"인 파일을 작성하고 AssemblyVersion 및 AssemblyFileVersion 속성을 생성 할 T4 템플리트를 배치하십시오.
<#@ template language="C#" #>
//
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
//
using System.Reflection;
[assembly: AssemblyVersion("1.0.1.<#= this.RevisionNumber #>")]
[assembly: AssemblyFileVersion("1.0.1.<#= this.RevisionNumber #>")]
<#+
int RevisionNumber = (int)(DateTime.UtcNow - new DateTime(2010,1,1)).TotalDays;
#>
버전 번호 생성 알고리즘을 결정해야합니다. 필자에게는 2010 년 1 월 1 일 이후의 일 수로 설정된 개정 번호를 자동 생성하는 것으로 충분했습니다.보다시피 버전 생성 규칙은 일반 C #으로 작성되어 있으므로 필요에 따라 쉽게 조정할 수 있습니다. .
- 위 파일은 프로젝트 중 하나에 배치해야합니다. 버전 관리 기술을 명확하게하기 위해이 단일 파일로 새 프로젝트를 만들었습니다. 이 프로젝트를 빌드하면 (실제로 빌드 할 필요조차 없습니다. 파일을 저장하면 Visual Studio 작업을 트리거하기에 충분합니다) 다음 C #이 생성됩니다.
//
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
//
using System.Reflection;
[assembly: AssemblyVersion("1.0.1.113")]
[assembly: AssemblyFileVersion("1.0.1.113")]
예, 오늘은 2010 년 1 월 1 일부터 113 일입니다. 내일 개정 번호가 변경됩니다.
- 다음 단계는 동일한 자동 생성 버전 정보를 공유해야하는 모든 프로젝트의 AssemblyInfo.cs 파일에서 AssemblyVersion 및 AssemblyFileVersion 속성을 제거하는 것입니다. 대신 각 프로젝트에 대해 "기존 항목 추가"를 선택하고 T4 템플릿 파일이있는 폴더로 이동 한 다음 해당 ".cs"파일을 선택하여 링크로 추가하십시오. 그렇게 할 것입니다!
이 접근 방식에서 내가 좋아하는 점은 가볍고 (맞춤형 MsBuild 작업 없음) 자동 생성 된 버전 정보가 소스 제어에 추가되지 않는다는 것입니다. 물론 버전 생성 알고리즘에 C #을 사용하면 복잡한 알고리즘이 열립니다.
이것은 T4 제안을 구현 한 것입니다 ... 선택한 구성 (예 : Debug | Release)에 관계없이 프로젝트를 빌드 할 때마다 빌드 번호가 증가하고 릴리스 빌드를 수행 할 때마다 개정 번호가 증가합니다. 응용 프로그램 ➤ 어셈블리 정보 ...를 통해 주 버전 및 부 버전 번호를 계속 업데이트 할 수 있습니다 .
더 자세히 설명하기 위해 기존 AssemblyInfo.cs
파일 을 읽고 정규식을 사용하여 AssemblyVersion
정보를 찾은 다음의 입력을 기반으로 개정 및 빌드 번호를 증가시킵니다 TextTransform.exe
.
- 기존
AssemblyInfo.cs
파일을 삭제하십시오 . AssemblyInfo.tt
그 자리에 파일을 작성하십시오 .AssemblyInfo.cs
T4 파일을 저장 한 후 Visual Studio 에서 T4 파일을 만들어 그룹화 해야 합니다.<#@ template debug="true" hostspecific="true" language="C#" #> <#@ output extension=".cs" #> <#@ import namespace="System.IO" #> <#@ import namespace="System.Text.RegularExpressions" #> <# string output = File.ReadAllText(this.Host.ResolvePath("AssemblyInfo.cs")); Regex pattern = new Regex("AssemblyVersion\\(\"(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<revision>\\d+)\\.(?<build>\\d+)\"\\)"); MatchCollection matches = pattern.Matches(output); if( matches.Count == 1 ) { major = Convert.ToInt32(matches[0].Groups["major"].Value); minor = Convert.ToInt32(matches[0].Groups["minor"].Value); build = Convert.ToInt32(matches[0].Groups["build"].Value) + 1; revision = Convert.ToInt32(matches[0].Groups["revision"].Value); if( this.Host.ResolveParameterValue("-","-","BuildConfiguration") == "Release" ) revision++; } #> using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Resources; // General Information [assembly: AssemblyTitle("Insert title here")] [assembly: AssemblyDescription("Insert description here")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Insert company here")] [assembly: AssemblyProduct("Insert product here")] [assembly: AssemblyCopyright("Insert copyright here")] [assembly: AssemblyTrademark("Insert trademark here")] [assembly: AssemblyCulture("")] // Version informationr( [assembly: AssemblyVersion("<#= this.major #>.<#= this.minor #>.<#= this.revision #>.<#= this.build #>")] [assembly: AssemblyFileVersion("<#= this.major #>.<#= this.minor #>.<#= this.revision #>.<#= this.build #>")] [assembly: NeutralResourcesLanguageAttribute( "en-US" )] <#+ int major = 1; int minor = 0; int revision = 0; int build = 0; #>
사전 빌드 이벤트에 이것을 추가하십시오.
"%CommonProgramFiles(x86)%\microsoft shared\TextTemplating\$(VisualStudioVersion)\TextTransform.exe" -a !!BuildConfiguration!$(Configuration) "$(ProjectDir)Properties\AssemblyInfo.tt"
빌드 및 개정을 위해 별표를 넣으면 Visual Studio는 2000 년 1 월 1 일 이후의 일 수를 빌드 번호로 사용하고 자정 이후의 초 수를 개정으로 2로 나눕니다.
훨씬 더 나은 생명의 은인 솔루션은 http://autobuildversion.codeplex.com/입니다.
그것은 매력처럼 작동하며 매우 유연합니다.
MSDN의 AssemblyInfo.cs에 대한 인용문은 다음과 같습니다 .
모든 값을 지정하거나 별표 ( )를 사용하여 기본 빌드 번호, 개정 번호 또는 둘 다를 승인 할 수 있습니다 . 예를 들어 [assembly : AssemblyVersion ( "2.3.25.1")]은 주 버전으로 2, 부 버전으로 3, 빌드 번호로 25, 개정 번호로 1을 나타냅니다. [assembly : AssemblyVersion ( "1.2. ")] 과 같은 버전 번호는 1을 주 버전으로, 2를 부 버전으로 지정하고 기본 빌드 및 개정 번호를 승인합니다. [assembly : AssemblyVersion ( "1.2.15. *")]과 같은 버전 번호는 1을 주 버전으로, 2를 부 버전으로, 15를 빌드 번호로 지정하고 기본 개정 번호를 승인합니다. 기본 빌드 번호는 매일 증가합니다. 기본 개정 번호는 임의입니다
이것은 1.1. *를 어셈블리 정보에 넣으면 빌드 번호 만 자동 증가하며 모든 빌드 후에가 아니라 매일 발생합니다. 개정 번호는 매 빌드마다 변경되지만 점진적으로 변경되는 것이 아니라 임의로 변경됩니다.
이것은 대부분의 사용 사례에 충분할 것입니다. 그것이 당신이 찾고있는 것이 아니라면, 당신은 사전 빌드 단계에서 버전 #을 자동 증가시키는 스크립트를 작성해야합니다.
AssemblyInfo.cs 사용
App_Code :에서 파일을 만들고 다음을 작성하거나 다른 속성 / 속성 가능성을 위해 Google을 사용하십시오.
AssemblyInfo.cs
using System.Reflection;
[assembly: AssemblyDescription("Very useful stuff here.")]
[assembly: AssemblyCompany("companyname")]
[assembly: AssemblyCopyright("Copyright © me 2009")]
[assembly: AssemblyProduct("NeatProduct")]
[assembly: AssemblyVersion("1.1.*")]
AssemblyVersion은 여러분이 실제로 따르는 부분입니다.
그런 다음 웹 사이트, aspx 페이지 또는 컨트롤에서 작업하는 경우 <Page> 태그에 다음을 추가 할 수 있습니다.
CompilerOptions="<folderpath>\App_Code\AssemblyInfo.cs"
(물론 적절한 변수로 폴더 경로를 바꾸는 것).
다른 클래스에 대해 어떤 방식 으로든 컴파일러 옵션을 추가해야한다고 생각하지 않습니다. App_Code의 모든 것은 컴파일 될 때 버전 정보를 받아야합니다.
희망이 도움이됩니다.
Matt Griffith의 UpdateVersion을 사용해 볼 수 있습니다. 지금은 꽤 오래되었지만 잘 작동합니다. 이를 사용하려면 AssemblyInfo.cs 파일을 가리키는 사전 빌드 이벤트를 설정하기 만하면 응용 프로그램이 명령 줄 인수에 따라 버전 번호를 적절하게 업데이트합니다.
응용 프로그램이 오픈 소스이기 때문에 (Major version). (Minor version). ([year] [dayofyear]). (increment) 형식을 사용하여 버전 번호를 늘리는 버전도 만들었습니다 . 이 코드와 수정 된 코드에 대한 자세한 내용은 내 블로그 항목 인 Assembly Version Numbers 및 .NET에서 확인할 수 있습니다.
업데이트 : 수정 된 버전의 UpdateVersion 응용 프로그램 코드를 GitHub에 넣었습니다. https://github.com/munr/UpdateVersion
버전 별표 (예 : "2.10.3. *")-단순하지만 숫자가 너무 큽니다.
AutoBuildVersion-좋아 보이지만 VS2010에서 작동하지 않습니다.
@DrewChapin의 스크립트는 작동하지만 스튜디오에서 디버그 사전 빌드 이벤트 및 릴리스 사전 빌드 이벤트에 대해 다른 모드를 설정할 수 없습니다.
그래서 스크립트를 조금 변경했습니다 ... commamd :
"%CommonProgramFiles(x86)%\microsoft shared\TextTemplating\10.0\TextTransform.exe" -a !!$(ConfigurationName)!1 "$(ProjectDir)Properties\AssemblyInfo.tt"
및 스크립트 ( "디버그"및 "릴리스"구성에서 작동) :
<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Windows.Forms" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Text.RegularExpressions" #>
<#
int incRevision = 1;
int incBuild = 1;
try { incRevision = Convert.ToInt32(this.Host.ResolveParameterValue("","","Debug"));} catch( Exception ) { incBuild=0; }
try { incBuild = Convert.ToInt32(this.Host.ResolveParameterValue("","","Release")); } catch( Exception ) { incRevision=0; }
try {
string currentDirectory = Path.GetDirectoryName(Host.TemplateFile);
string assemblyInfo = File.ReadAllText(Path.Combine(currentDirectory,"AssemblyInfo.cs"));
Regex pattern = new Regex("AssemblyVersion\\(\"\\d+\\.\\d+\\.(?<revision>\\d+)\\.(?<build>\\d+)\"\\)");
MatchCollection matches = pattern.Matches(assemblyInfo);
revision = Convert.ToInt32(matches[0].Groups["revision"].Value) + incRevision;
build = Convert.ToInt32(matches[0].Groups["build"].Value) + incBuild;
}
catch( Exception ) { }
#>
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Game engine. Keys: F2 (Debug trace), F4 (Fullscreen), Shift+Arrows (Move view). ")]
[assembly: AssemblyProduct("Game engine")]
[assembly: AssemblyDescription("My engine for game")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyCopyright("Copyright © Name 2013")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type. Only Windows
// assemblies support COM.
[assembly: ComVisible(false)]
// On Windows, the following GUID is for the ID of the typelib if this
// project is exposed to COM. On other platforms, it unique identifies the
// title storage container when deploying this assembly to the device.
[assembly: Guid("00000000-0000-0000-0000-000000000000")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
[assembly: AssemblyVersion("0.1.<#= this.revision #>.<#= this.build #>")]
[assembly: AssemblyFileVersion("0.1.<#= this.revision #>.<#= this.build #>")]
<#+
int revision = 0;
int build = 0;
#>
Build Versioning 과 같은 빌드 스크립트를 사용하여 고급 버전 관리를 수행 할 수 있습니다.
'Programing' 카테고리의 다른 글
MySQL에서 마지막으로 실행 된 쿼리를 표시하는 방법은 무엇입니까? (0) | 2020.02.17 |
---|---|
포인터 명확성의 배열 / 배열에 대한 C 포인터 (0) | 2020.02.17 |
컨텐츠 스크립트를 사용하여 페이지 컨텍스트에 코드 삽입 (0) | 2020.02.17 |
파이썬 모듈 소스의 위치는 어떻게 찾습니까? (0) | 2020.02.17 |
Enum 값의 속성 얻기 (0) | 2020.02.17 |