2008-08-03 4 views
95

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

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

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

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

+0

Следующий вопрос имеет простое удобное решение о том, как ввести номер сборки в ваше приложение, создав исходный файл в событии сборки. http://stackoverflow.com/questions/4450231/can-i-make-a-constant-from-a-compile-time-env-variable-in-csharp – 2012-04-29 23:54:46

+0

Возможный дубликат [Могу ли я автоматически увеличить версию сборки файла при использовании Visual Studio?] (https://stackoverflow.com/questions/356543/can-i-automatic-increment-the-file-build-version-when-using-visual-studio) – 2017-10-28 04:34:45

ответ

84

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

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

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

+3

Я только что нашел эту визуальную студию надстройка, которая делает что-то подобное: http://autobuildversion.codeplex.com/ – jrsconfitto 2010-05-27 18:15:18

+6

Означает ли это, что 4 июня 2179 г. номера версий Microsoft по умолчанию будут ломаться? (65536-й день после 2000 года) – ThePower 2011-11-07 14:35:44

+1

@Jugglingnutcase - эта ссылка была бы почти идеальной, если бы она работала для текущих версий визуальной студии – 2015-06-03 20:31:01

6

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

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

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

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

1

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

  1. Отделите сборкуinfo на товарные части (название компании, версию и т. Д.) И детали, относящиеся к сборке (название сборки и т. Д.). См. here
  2. Также - я использую subversion, поэтому мне было полезно установить номер сборки для номера версии подрывной версии, тем самым упростив всегда возвращение к базе кода, которая сгенерировала сборку (например, 1.4.100.1502 был создан из ревизии 1502).
19

VS.NET по умолчанию использует версию сборки версии 1.0. * И использует следующую логику при автоинкрементации: она устанавливает часть сборки на количество дней с 1 января 2000 года и устанавливает часть ревизии в количество секунд с полуночи, местное время, разделенное на два. См. Это MSDN article.

Монтажная версия находится в файле 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")> 
0

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

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

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

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

я вручную обновить MAJOR.MINOR номера, но пусть MSBuild для автоматического обновления номера сборки (1.1. , 1.1. , 1.1. и т.д. :)

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

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

Смежные вопросы