Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自动更新版本号_C#_Visual Studio_Versioning - Fatal编程技术网

C# 自动更新版本号

C# 自动更新版本号,c#,visual-studio,versioning,C#,Visual Studio,Versioning,我希望应用程序的version属性在每次生成时都会增加,但我不确定如何在Visual Studio(2005/2008)中启用此功能。我曾尝试将AssemblyVersion指定为1.0.*但它并不能完全满足我的要求 我还使用了一个设置文件,在以前的尝试中,当程序集版本更改时,我的设置被重置为默认设置,因为应用程序在另一个目录中查找设置文件 我希望能够以1.1.38的形式显示版本号,这样当用户发现问题时,我可以记录他们正在使用的版本,并告诉他们如果有旧版本,就升级 对版本控制工作原理的简短解释也

我希望应用程序的version属性在每次生成时都会增加,但我不确定如何在Visual Studio(2005/2008)中启用此功能。我曾尝试将AssemblyVersion指定为1.0.*但它并不能完全满足我的要求

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

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

对版本控制工作原理的简短解释也将不胜感激。什么时候版本号和版本号会增加?

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

有关更多信息,请参阅/v标记中的文档

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

可以将其配置为自动增加内部版本号

有两个陷阱:

  • 版本字符串中的4个数字都限制为65535。这是Windows限制,不太可能得到修复。
  • 与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。

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

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

    我通常使用某种形式的黑客将其显示为版本号


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

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

  • 将组件信息分为产品零件(公司名称、版本等)和组件特定零件(组件名称等)。看
  • 另外-我使用subversion,因此我发现将内部版本号设置为subversion修订号很有帮助,从而可以很容易地返回生成程序集的代码库(例如,1.4.100.1502是从修订版1502构建的)

  • VS.NET将程序集版本默认为1.0.*并在自动递增时使用以下逻辑:它将生成部分设置为自2000年1月1日起的天数,并将修订部分设置为自本地时间午夜起的秒数除以2。看这个

    程序集版本位于assemblyinfo.vb或assemblyinfo.cs文件中。从文件中:

    程序集的版本信息由以下四个值组成: ' 主要版本 "小版本", “建筑编号 "修订", ' '您可以指定所有值,也可以默认版本号和修订号 '通过使用“*”,如下所示: '
    如果希望在每次编译完成时更新一个自动递增的数字,可以使用“从预生成事件”。如果愿意,您的预构建事件可以检查构建配置,以便版本号只会随着发布版本(例如)的增加而增加。

    我发现,只要在需要产品版本的地方使用以下命令显示上一次构建的日期就行了:

    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
    类,该类将获取当前版本号并发回更新后的版本号(我建议仅为该类创建一个单独的项目)

    我手动更新主版本号和次版本号,但让MSBuild自动更新版本号(1.1.1、1.1.2、1.1.3等):

    然后在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>
     ..
    
    c:\nuget\nuget
    是我拥有nuget客户端的地方(请记住通过调用
    nuget SetApiKey
    保存您的nuget API密钥,或者在nuget push调用中包含密钥)


    以防万一,它会对某人有所帮助。

    这里有一个手动启动的替代选项:这是我编写的一个快速而肮脏的PowerShell代码片段,在Jenkins构建系统的预构建步骤中调用

    它将
    AssemblyVersion
    AssemblyFileVersion
    的最后一位设置为生成系统自动设置的
    BUILD\u NUMBER
    环境变量的值

    if(测试路径环境:构建编号){
    写入主机“将AssemblyVersion更新为$env:BUILD\u编号”
    #获取AssemblyInfo.cs
    $assemblyInfo=获取内容-路径。\myshinyaapplication\Properties\assemblyInfo.cs
    #替换AssemblyVersion的最后一位数字
    $assemblyInfo=$assemblyInfo-替换
    “^\[assembly:AssemblyVersion\(`”([0-9]+)\.([0-9]+)\.([0-9]+)\.[0-9]+`\]”,
    (“[assembly:AssemblyVersion(“$1.$2.$3.+$env:BUILD_NUMBER+”)”)
    写入主机($assemblyInfo-匹配“^\[程序集:AssemblyVersion”)
    #替换AssemblyFileVersion的最后一位数字
    $assemblyInfo=$assemblyInfo-替换
    “^\[assem
    
    <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>
     ..
    
    <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" />