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



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



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



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



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

755   7  

7 ответов:

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

для получения дополнительной информации см. Компоновщик Сборок документация в теге /V.

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

AssemblyInfo Task

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

есть 2 Gotchas:

  1. каждое из 4 чисел в строке версии ограничено 65535. Это ограничение Windows и вряд ли будет исправлено.
  2. использование с с 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.Незначительный.Освобождать.Build) можно было бы ожидать.

в .net, это главное.Незначительный.Строить.Пересмотр.

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

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

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

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

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

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

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

[Visual Studio 2017,.csproj свойства]

чтобы автоматически обновить свойство PackageVersion / Version / AssemblyVersion (или любое другое свойство), сначала создайте новое Microsoft.Build.Utilities.Task класс, который получит ваш текущий номер сборки и отправит обратно обновленный номер (я рекомендую создать отдельный проект только для этого класса).

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

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

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

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

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

Comments

    Ничего не найдено.