Автоматически обновлять номер версии - PullRequest
103 голосов
/ 03 августа 2008

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

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

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

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

Ответы [ 7 ]

93 голосов
/ 03 августа 2008

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

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

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

AssemblyInfo Task

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

Есть 2 Gotchas:

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

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

22 голосов
/ 01 октября 2008

VS.NET по умолчанию использует версию сборки 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")> 
9 голосов
/ 05 марта 2013

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

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;
}
6 голосов
/ 03 августа 2008

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

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

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

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

2 голосов
/ 10 мая 2017

[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).

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

1 голос
/ 04 августа 2008

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

  1. разделяет информацию о сборке на части продукта (название компании, версия и т. Д.) И отдельные детали сборки (название сборки и т. Д.). Смотри здесь
  2. Кроме того, я использую Subversion, поэтому мне было полезно установить номер сборки на номер ревизии Subversion, тем самым упростив всегда возвращаться к базе кода, которая генерировала сборку (например, 1.4.100.1502 был собран из ревизии 1502) .
0 голосов
/ 01 марта 2010

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

...