自动更新版本号

时间:2008-08-03 11:12:52

标签: c# visual-studio versioning

我希望我的应用程序的version属性为每个构建增加但我不确定如何在Visual Studio(2005/2008)中启用此功能。我试图将AssemblyVersion指定为1.0。*但它并没有让我得到我想要的。

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

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

对于版本控制如何工作的简短说明也将受到赞赏。构建和修订号何时增加?

8 个答案:

答案 0 :(得分:92)

使用“内置”的东西,你不能,因为使用1.0。*或1.0.0。*将用编码的日期/时间戳替换修订和构建号码,这通常也是一个好方法。

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

至于自动递增数字,请使用AssemblyInfo任务:

AssemblyInfo Task

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

有2个问题:

  1. 版本字符串中的4个数字中的每一个都限制为65535.这是Windows限制,不太可能得到修复。
  2. 与Subversion一起使用需要一个小的改动:
  3. 检索版本号非常简单:

    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。

答案 1 :(得分:21)

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

答案 2 :(得分:9)

我发现只需在需要产品版本的地方使用以下内容简单显示上次构建的日期就可以了:

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

答案 3 :(得分:6)

您使用的是哪种源控制系统?

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

我通常使用某种形式的hackery来显示它作为版本号。

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

答案 4 :(得分:2)

[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"以便在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推送调用中包含密钥)。

以防它帮助某人^ _ ^。

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

如果您想要每次编译完成时更新的自动递增数字,您可以使用预构建事件中的VersionUpdater。如果您愿意,您的预构建事件可以检查构建配置,以便版本号仅为Release版本增加(例如)。

答案 7 :(得分:0)

这是一个手动替代选项:这是我编写的一个快速而肮脏的 PowerShell 片段,它从我们的 Jenkins 构建系统上的预构建步骤中调用。

它将 <div id="respond"> <form action="post_comment.php" method="post" id="commentform"> <label for="comment_author" class="required">Your name</label> <input type="text" name="comment_author" id="comment_author" value="" tabindex="1" required="required"> <label for="email" class="required">Your email;</label> <input type="email" name="email" id="email" value="" tabindex="2" required="required"> <label for="comment" class="required">Your message</label> <textarea name="comment" id="comment" rows="10" tabindex="4" required="required"></textarea> <input type="hidden" name="comment_post_ID" value="1" id="comment_post_ID" /> <input name="submit" type="submit" value="Submit comment" /> </form> </div>AssemblyVersion 的最后一位数字设置为由构建系统自动设置的 AssemblyFileVersion 环境变量的值。

BUILD_NUMBER