Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

Задача AssemblyInfo

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

Есть 2 ошибки:

  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.

Другие советы

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

[Визуальная студия 2017, .csproj характеристики]

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

Я вручную обновляю номера major.minor, но позволяю MSBuild автоматически обновлять номер сборки (1.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).

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

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

  1. разделите информацию о сборке на части продукта (название компании, версия и т. д.) и части, специфичные для сборки (название сборки и т. д.).Видеть здесь
  2. Кроме того, я использую Subversion, поэтому мне показалось полезным установить номер сборки равным номеру версии Subversion, что позволяет легко всегда вернуться к базе кода, которая сгенерировала сборку (например,1.4.100.1502 построен из ревизии 1502).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top