Автоматично оновлювати номер версії


108

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

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

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

Коротке пояснення того, як працює версія, також буде оцінено. Коли номер збірки та перегляду збільшується?


Наступне питання має просте зручне рішення щодо того, як ввести номер збірки у вашу програму, генеруючи вихідний файл у події збірки. stackoverflow.com/questions/4450231/…
Ешлі Девіс

Відповіді:


96

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

Для отримання додаткової інформації дивіться Документацію по збірці лінкерів у тезі / v.

Що стосується автоматичного збільшення числа, використовуйте завдання AssemblyInfo:

Завдання АсамблеїІнфо

Це можна налаштувати для автоматичного збільшення номера збірки.

Є 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.Minor.Release.Build).

У .net, це Major.Minor.Build.Revision.


3
Я щойно знайшов цю візуальну студійну надбудову, яка робить щось подібне: autobuildversion.codeplex.com
jrsconfitto

6
Чи означає це, що 4 червня 2179 року номери версій за замовчуванням Microsoft зламаються? (65536-й день після 2000 року)
Ллойд Пауелл

1
@Jugglenutcase - це посилання було б майже ідеальним, якби він працював у сучасних версіях візуальної студії
Kraang Prime

2
@SanuelJackson ха-ха! так, це було б. занадто погано, я не відстаю від своїх коментарів з 2010 року, вибачте! : P Марш часу та версій засмучує всіх нас.
jrsconfitto

@Michael Stum: Чи можете ви оновити посилання на завдання Завдання AssemblyInfo у відповіді? Для мене це неправильне завантаження.
Метт

22

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

Дякуємо за включення початкової дати:January 1st, 2000
kiewic

11

Я виявив, що добре працює просто відображати дату останньої збірки, використовуючи наступну, де потрібна версія продукту:

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
Я думаю, ти це маєш на увазі: yyyy.MM.dd.HHmm не yyyy.MM.dd.HHMM
JHubbard80

1
Це найпростіше рішення мати якийсь номер версії, прикріплений до зміни файлу складання.
Олексій

6

Яку систему управління джерелом ви використовуєте?

Майже всі вони мають певну форму тега $ Id $, яка розширюється при реєстрації файлу.

Зазвичай я використовую певну форму хакерів, щоб відобразити це як номер версії.

Іншою альтернативою є використання дати як номера збірки: 080803-1448


Чи можете ви розширити "Майже всі вони мають певну форму тегу $ Id $, яка розширюється, коли файл зареєстрований". Конкретно, чи знаєте ви субверсію?
Грег Б

3

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

}

Потім зателефонуйте нещодавно створеному Task on 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).

Про всяк випадок, коли це комусь допомагає ^ _ ^.


1

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

  1. розділити інформацію про збірку на частини виробу (назва компанії, версія тощо) та конкретні складові частини (назва збірки тощо). Дивіться тут
  2. Крім того - я використовую підрив, тому я вважаю корисним встановити номер збірки на номер ревізії підриву, тим самим полегшуючи завжди повертатися до бази даних коду, яка генерувала збірку (наприклад, 1.4.100.1502 був побудований з версії 1502).

Якщо це файл коду ( .cs / .vb), замість цього слід використовувати шаблон T4.
BrainSlugs83

0

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


Цікаво. Я мав свою власну роками з такою ж назвою і не знав, що існує (хоча я нещодавно виклав її в Інтернеті): github.com/rjamesnw/VersionUpdater
James Wilkins
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.