代码之家  ›  专栏  ›  技术社区  ›  Robert Höglund

自动更新版本号

  •  100
  • Robert Höglund  · 技术社区  · 17 年前

    我希望为每个生成增加应用程序的版本属性,但不确定如何在Visual Studio(2005/2008)中启用此功能。我已尝试将assemblyversion指定为1.0.*但它无法完全满足我的需要。

    我也在使用设置文件,在之前的尝试中,当程序集版本更改时,由于应用程序在另一个目录中查找设置文件,我的设置被重置为默认设置。

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

    对版本控制如何工作的简短解释也会受到赞赏。版本号和修订号何时递增?

    7 回复  |  直到 8 年前
        1
  •  90
  •   Michael Stum    12 年前

    有了“内置”功能,您就不能像使用1.0.*或1.0.0.*那样,用编码的日期/时间戳替换修订号和内部版本号,这通常也是一种好方法。

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

    对于自动递增的数字,请使用assemblyinfo任务:

    AssemblyInfo Task

    这可以配置为自动增加内部版本号。

    有两种方法:

    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。

        2
  •  19
  •   Dave M NPE    12 年前

    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")> 
    
        3
  •  8
  •   Tony    8 年前

    我发现,只要在需要产品版本的地方使用以下内容,就可以很好地显示上次生成的日期:

    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;
    }
    
        4
  •  6
  •   engtech    17 年前

    您使用的是什么源代码管理系统?

    几乎所有文件都有某种形式的$id$标记,当文件签入时,这些标记会被扩展。

    我通常使用某种形式的黑客来显示这个版本号。

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

        5
  •  2
  •   Nacho Coll    8 年前

    [Visual Studio 2017, CSPROJ 性质]

    要自动更新packageversion/version/assemblyversion属性(或任何其他属性),请首先创建一个新的 Microsoft.Build.Utilities.Task 类,它将获取当前的内部版本号并返回更新的版本号(我建议为该类创建一个单独的项目)。

    我手动更新major.minor号,但让msbuild自动更新build号(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" 用于在生成前执行任务)将触发刷新版本代码以计算新版本号,以及 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 Push调用中包含键)。

    以防万一它能帮助别人。

        6
  •  1
  •   caryden    17 年前

    一段时间前,我写了一个快速而脏的exe,它将更新assemblyinfo中的版本。cs/vb-我还使用了rxfind.exe(一个简单而强大的基于regex的搜索替换工具)从命令行进行更新,作为构建过程的一部分。其他一些有用的提示:

    1. 将assemblyinfo分为产品部件(公司名称、版本等)和特定于部件的部件(部件名称等)。见 here
    2. 另外-我使用Subversion,所以我发现将build number设置为Subversion revision number很有帮助,这样可以很容易地返回生成程序集的代码库(例如,1.4.100.1502是从1502版生成的)。
        7
  •  0
  •   user283258    15 年前

    如果希望每次编译完成时更新自动递增的数字,可以使用 VersionUpdater 来自预生成事件。如果您愿意,您的预构建事件可以检查构建配置,以便版本号对于发布构建只会增加(例如)。