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

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

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

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

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

3.08.2008 11:12:52
Следующий вопрос имеет простое удобное решение о том, как внедрить номер сборки в ваше приложение путем создания исходного файла в событии сборки. stackoverflow.com/questions/4450231/…
Ashley Davis 29.04.2012 23:54:46
7 ОТВЕТОВ
РЕШЕНИЕ

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

Для получения дополнительной информации см. Документацию компоновщика сборки в теге / 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.

96
28.01.2013 04:10:16
я только что нашел этот Visual Studio надстройка, которая делает что - то подобное: autobuildversion.codeplex.com
jrsconfitto 27.05.2010 18:15:18
Означает ли это, что 4 июня 2179 года номера версий Microsoft по умолчанию сломаются? (65536-й день после 2000 г.)
Lloyd Powell 7.11.2011 14:35:44
@Jugglingnutcase - эта ссылка была бы почти идеальной, если бы она работала для текущих версий визуальной студии
Kraang Prime 3.06.2015 20:31:01
@SanuelJackson, ха-ха! да, это будет. Жаль, что я не успеваю за комментариями 2010 года, извините! : P Марш времени и версий огорчает всех нас.
jrsconfitto 5.06.2015 18:24:57
@Michael Stum: Не могли бы вы обновить ссылку для TaskInfo Task в своем ответе, пожалуйста? Для меня это не правильно загружается.
Matt 22.06.2017 13:12:27

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")> 
22
29.10.2012 03:25:13
Спасибо, что January 1st, 2000
kiewic 12.04.2016 20:28:44

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

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;
}
10
25.03.2017 16:30:27
Я думаю, вы имеете в виду это: гггг.ММ.дд.Хммммм не гггг.ММ.дд.ЧЧММ.
JHubbard80 2.04.2013 17:46:38
Это самое простое решение - добавить какой-либо номер версии к изменению файла сборки.
Alexei 1.03.2019 08:31:57

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

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

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

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

6
3.08.2008 18:46:33
Можете ли вы расширить «Почти все из них имеют некоторую форму тега $ Id $, который раскрывается при регистрации файла». В частности, вы знаете, для подрывной деятельности?
Greg B 30.06.2009 18:10:04

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

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

3
10.05.2017 14:28:41

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

  1. разделить информацию о сборке на части продукта (название компании, версия и т. д.) и отдельные детали сборки (название сборки и т. д.). Смотрите здесь
  2. Кроме того - я использую Subversion, поэтому я нашел полезным установить номер сборки на номер ревизии Subversion, тем самым облегчая возможность всегда вернуться к базе кода, которая генерировала сборку (например, 1.4.100.1502 была построена из ревизии 1502).
1
4.08.2008 19:51:49
Если это для файла кода ( .cs / .vb), вы должны использовать шаблон T4.
BrainSlugs83 26.04.2018 00:53:37

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

0
28.02.2010 21:16:35
Интересно. В течение многих лет у меня было свое собственное имя с таким же именем, и я не знал, что оно существует (хотя я недавно выложил его в сеть): github.com/rjamesnw/VersionUpdater
James Wilkins 11.08.2017 20:06:25