Сведения о вопросе

DUNKER

16:03, 1st July, 2020

Теги

Автоматическое обновление номера версии

Просмотров: 598   Ответов: 7

Я бы хотел, чтобы свойство version моего приложения увеличивалось для каждой сборки, но я не уверен, как включить эту функциональность в Visual Studio (2005/2008)., я пытался указать AssemblyVersion как 1.0. но это не дает мне точно то, что я хочу.

Я также использую файл настроек и в предыдущих попытках, когда версия assembly изменила мои настройки, они были сброшены по умолчанию, так как приложение искало файл настроек в другом каталоге.

Я хотел бы иметь возможность отображать номер версии в виде 1.1.38, поэтому, когда пользователь находит проблему, я могу зарегистрировать версию, которую он использует, а также сказать им обновить, если у них есть старая версия.

Кроме того, мы хотели бы получить краткое объяснение того, как работает управление версиями. Когда увеличивается число сборок и ревизий?



  Сведения об ответе

JUST___

18:03, 1st July, 2020

С вещами "Built in" вы не можете, как и с использованием 1.0.* или 1.0.0.* заменит номера ревизии и сборки на кодированные date/timestamp,, что обычно также является хорошим способом.

Дополнительные сведения см. В документации по компоновщику Assembly в теге /v.

Что касается автоматического увеличения числа, используйте задачу AssemblyInfo:

AssemblyInfo задача

Это можно настроить для автоматического увеличения номера сборки.

Есть 2 проблемы:

  1. Каждое из 4 чисел в строке версии ограничено числом 65535. Это ограничение Windows и вряд ли будет исправлено.
  2. Использование with with 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#, сборка на самом деле является номером THIRD, а не четвертым, как могли бы ожидать некоторые люди (например, разработчики Delphi, которые привыкли к Major.Minor.Release.Build).

В .net году это будет Major.Minor.Build.Revision.


  Сведения об ответе

PAGE

18:03, 1st July, 2020

VS.NET по умолчанию версия Assembly имеет значение 1.0.* и использует следующую логику при автоматическом инкрементировании: он устанавливает часть сборки в число дней с 1 января 2000 года, а часть ревизии-в число секунд с полуночи по местному времени, разделенное на два. Смотрите эту статью MSDN .

Версия Assembly находится в файле 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")> 


  Сведения об ответе

nYU

18:03, 1st July, 2020

Я обнаружил, что это хорошо работает, чтобы просто отобразить дату последней сборки, используя следующее везде, где требуется версия продукта:

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


  Сведения об ответе

SKY

18:03, 1st July, 2020

Какую систему управления версиями вы используете?

Почти все они имеют некоторую форму тега $ Id$, который расширяется при возврате файла.

Я обычно использую какую-то форму хакерства, чтобы отобразить это как номер версии.

Другой альтернативой является использование даты в качестве номера сборки: 080803-1448


  Сведения об ответе

LIZA

18:03, 1st July, 2020

[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 процесс добавления следующего кода в ваш файл .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 API, позвонив nuget SetApiKey <my-api-key> , или включить ключ в push-вызов NuGet).

Просто на случай, если это кому-то поможет ^_^.


  Сведения об ответе

pumpa

18:03, 1st July, 2020

Некоторое время назад я написал быстрый и грязный exe, который обновил бы версию #в assemblyinfo.{cs/vb} - я также использовал rxfind.exe (простой и мощный инструмент замены поиска на основе regex), чтобы сделать обновление из командной строки как часть процесса сборки. Пара других полезных подсказок:

  1. разделите assemblyinfo на части продукта (название компании, Версия и т. д.) и assembly специфических частей (assembly имени etc.). Видеть здесь
  2. Кроме того, я использую subversion, поэтому я счел полезным установить номер сборки в номер редакции subversion, тем самым делая очень легким всегда возвращаться к кодовой базе, которая сгенерировала assembly (например, 1.4.100.1502 был построен из ревизии 1502).


  Сведения об ответе

9090

18:03, 1st July, 2020

Если требуется автоматически увеличивающееся число, которое обновляется каждый раз при выполнении компиляции, можно использовать VersionUpdater из события предварительной сборки. Ваше событие предварительной сборки может проверить конфигурацию сборки, если вы предпочитаете, чтобы номер версии увеличивался только для сборки выпуска (например).


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться