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

голоса
95

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

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

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

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

Задан 03/08/2008 в 12:12
источник пользователем
На других языках...                            


7 ответов

голоса
85

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

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

Что же касается автоматически увеличивающегося числа, используйте 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 Developers, которые используются для Major.Minor.Release.Build) могли бы ожидать.

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

Ответил 03/08/2008 в 12:41
источник пользователем

голоса
6

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

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

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

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

Ответил 03/08/2008 в 19:46
источник пользователем

голоса
1

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

  1. отделить AssemblyInfo на часть продукта (название компании, версию и т.д.) и сборку отдельных части (сборка имя и т.д.). Смотрите здесь
  2. Кроме того - я использую подрывной, поэтому я счел полезным, чтобы установить номер сборки для подрывного номера ревизии, таким образом, что делает его очень легко всегда вернуться к кодовому, создавшему узлу (например, 1.4.100.1502 был построен из ревизии 1502).
Ответил 04/08/2008 в 20:51
источник пользователем

голоса
19

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")> 
Ответил 30/09/2008 в 21:58
источник пользователем

голоса
0

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

Ответил 28/02/2010 в 22:16
источник пользователем

голоса
8

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

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;
}
Ответил 04/03/2013 в 21:58
источник пользователем

голоса
2

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

Для того, чтобы автоматически обновлять свойство PackageVersion / Версия / 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> или включить клавишу на нажимной вызова NuGet).

Только в случае, если это помогает кто-то ^ _ ^.

Ответил 10/05/2017 в 14:08
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more