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

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

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

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

Также будет оценено краткое объяснение того, как работает управление версиями. Когда число сборки и ревизии увеличивается с увеличением?

Ответ 1

С помощью функции "Встроенный" вы не можете, используя 1.0. * или 1.0.0. *, замените номера версий и сборки на кодированную дату/метку времени, что обычно также является хорошим способом.

Для получения дополнительной информации см. Assembly Linker Документация в теге /v.

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

Задача AssemblyInfo

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

Есть 2 Gotchas:

Извлечение номера версии довольно просто:

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 или, по крайней мере, на С#, сборка на самом деле является ТРЕТЬЯ цифрой, а не четвертой, поскольку некоторые люди (например, разработчики Delphi, которые используются для Major.Minor.Release.Build) могут ожидать.

В .net, это Major.Minor.Build.Revision.

Ответ 2

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

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

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

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

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

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

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

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

Ответ 5

[Свойства 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 Pack (просто измените на 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 (не забудьте сохранить свой ключ API NuGet, вызвав nuget SetApiKey <my-api-key> или включить ключ в push-вызов NuGet).

На всякий случай это помогает кому-то ^ _ ^.

Ответ 6

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

  • разделяйте сборкуinfo на части продукта (название компании, версию и т.д.) и отдельные детали сборки (название сборки и т.д.). См. здесь
  • Кроме того, я использую subversion, поэтому мне было полезно установить номер сборки в номер версии подрывной версии, благодаря чему очень легко всегда вернуться к кодовой базе, которая сгенерировала сборку (например, 1.4.100.1502 был построен из ревизии 1502).

Ответ 7

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