自动更新版本号

问题描述:

我想为每个构建增加我的应用程序的版本属性,但我不确定如何在Visual Studio(2005/2008)中启用此功能。我试图将AssemblyVersion指定为1.0 *,但它并不能完全满足我的要求。自动更新版本号

我也在使用一个设置文件,并且在程序集版本改变我的设置的早期尝试中,由于应用程序在另一个目录中查找设置文件而重置为默认设置。

我希望能够以1.1.38的形式显示版本号,因此,当用户发现问题时,我可以记录他们正在使用的版本,并告诉他们如果他们有旧版本。

对版本控制工作原理的简短解释也将被赞赏。构建版本和修订版本号何时增加?

+0

下面的问题有一个简单的方便的解决方案,以便如何通过在构建事件中生成源文件来将构建号注入到您的应用程序中。 http://*.com/questions/4450231/can-i-make-a-constant-from-a-compile-time-env-variable-in-csharp – 2012-04-29 23:54:46

+0

可能重复的[我可以自动增加文件构建版本当使用Visual Studio?](https://*.com/questions/356543/can-i-automatically-increment-the-file-build-version-when-using-visual-studio) – 2017-10-28 04:34:45

随着“内置”的东西,你不能,因为使用1.0。*或1.0.0。*将取代版本和编号的日期/时间戳,这通常也是一个好方法。

有关详细信息,请参阅/ v标记中的Assembly Linker文档。

至于自动递增号码,使用的AssemblyInfo任务:

AssemblyInfo Task

这可被配置为自动递增版本号。

有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)可能会有所期待。

在.net中,它是Major.Minor.Build.Revision。

+3

我刚刚发现这个视觉工作室插件,做类似的事情:http://autobuildversion.codeplex.com/ – jrsconfitto 2010-05-27 18:15:18

+6

这是否意味着在2179年6月4日微软的默认版本号将打破? (2000年后的第65536天) – ThePower 2011-11-07 14:35:44

+1

@Jugglingnutcase - 如果它适用于当前版本的visual studio – 2015-06-03 20:31:01

您使用的是什么源码控制系统?

几乎所有的人都有某种形式的$ id $标签时,在文件中检查出被扩大。

我通常使用某种形式的两轮牛车来显示这是版本号。

另一种方法是使用使用日期作为版本号:080803-1448

前一段时间我写了一个快速和肮脏的exe文件,将更新版本号的在集信息{CS/vb} - 我还使用rxfind.exe(一个简单而强大的基于正则表达式的搜索替换工具)作为构建过程的一部分从命令行执行更新。一些其他帮助提示:

  1. 将assemblyinfo分离为产品部件(公司名称,版本等)和部件特定部件(部件名称等)。请参阅here
  2. 另外 - 我使用subversion,所以我发现将内部版本号设置为subversion版本号会很有帮助,因此可以很容易地返回到生成程序集的代码库(例如,1.4.100.1502是从修订版1502)。

VS.NET默认程序集的版本为1.0 *和使用以下逻辑时自动递增的:它集生成部分,自2000年1月1日的天数,并将一部分修改的自午夜以来的秒数,当地时间除以2。看到这个MSDN article

程序集版本位于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")> 

如果你想每一个编译完成时更新自动递增数字,你可以使用VersionUpdater从预生成事件。如果您愿意,您的预构建事件可以检查构建配置,以便版本号仅针对发布版本(例如)增量。

我发现它运作良好,简单地使用下面的显示在任何需要的产品版本,最后生成日期:

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

[Visual Studio中2017,的.csproj性质]

要自动更新您的PackageVersion/Version/AssemblyVersion属性(或任何其他属性),首先创建一个新的Microsoft.Build.Utilities.Task类,该类将获得您当前的内部版本号并发送更新后的编号(我建议为此创建单独的项目类)。

我手动更新MAJOR.MINOR数字,但让MSBuild的自动更新版本号(1.1。,1.1。,1.1。等:)

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包项目选项(只是改变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 SetApiKey <my-api-key>保存您的NuGet API密钥或包括在的NuGet推通话键)。

以防万一它帮助某人^ _ ^。