Могу ли я автоматически увеличивать версию сборки файла при использовании Visual Studio?

Мне было просто интересно, как я могу автоматически увеличивать сборку (и версию?) Моих файлов с помощью Visual Studio (2005).

Если я посмотрю свойства сказать C:\Windows\notepad.exeна вкладке Версия отображается "Версия файла: 5.1.2600.2180". Я хотел бы получить эти классные цифры и в версии моей библиотеки, а не в версии 1.0.0.0, что, правда, немного скучно.

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

Я работаю в основном с веб-проектами....

Я посмотрел на оба:

  1. http://www.codeproject.com/KB/dotnet/Auto_Increment_Version.aspx
  2. http://www.codeproject.com/KB/dotnet/build_versioning.aspx

и я не мог поверить, что столько усилий, чтобы сделать что-то, является стандартной практикой.

РЕДАКТИРОВАТЬ:он не работает в VS2005, насколько я могу сказать ( http://www.codeproject.com/KB/dotnet/AutoIncrementVersion.aspx)

27 ответов

Решение

В Visual Studio 2008 работает следующее.

Найдите файл AssemblyInfo.cs и найдите эти 2 строки:

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Вы можете попробовать изменить это на:

[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.*")]

Но это не даст вам желаемого результата, вы получите версию продукта 1.0.* И версию файла 1.0.0.0. Не то, что вы хотите!

Однако, если вы удалите вторую из этих строк и просто получите:

[assembly: AssemblyVersion("1.0.*")]

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

Откройте файл AssemblyInfo.cs и измените

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

в

[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyFileVersion("1.0.0.0")]

Вы можете сделать это в IDE, перейдя в проект -> свойства -> информация о сборке

Это, однако, только позволит вам автоматически увеличивать версию сборки и даст вам

Версия файла сборки: подстановочный знак ("*") в этом поле недопустим

окно сообщения, если вы попытаетесь поместить * в поле версии файла.

Так что просто откройте файл assemblyinfo.cs и сделайте это вручную.

Другим вариантом изменения номеров версий в каждой сборке является использование задачи " Версия" в MSBuild.Community.Tasks. Просто скачайте их установщик, установите его, затем адаптируйте следующий код и вставьте его после <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> в вашем .csproj файл:

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<Target Name="BeforeBuild">
    <Version VersionFile="Properties\version.txt" Major="1" Minor="0" BuildType="Automatic" StartDate="12/31/2009" RevisionType="BuildIncrement">
      <Output TaskParameter="Major" PropertyName="Major" />
      <Output TaskParameter="Minor" PropertyName="Minor" />
      <Output TaskParameter="Build" PropertyName="Build" />
      <Output TaskParameter="Revision" PropertyName="Revision" />
    </Version>
    <AssemblyInfo CodeLanguage="CS"
                  OutputFile="Properties\VersionInfo.cs"
                  AssemblyVersion="$(Major).$(Minor)"
                  AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" />
</Target>

Примечание. Адаптируйте свойство StartDate к вашей локали. В настоящее время он не использует инвариантную культуру.

Для третьей сборки 14 января 2010 года это создает VersionInfo.cs с этим содержанием:

[assembly: AssemblyVersion("1.0")]
[assembly: AssemblyFileVersion("1.0.14.2")]

Затем этот файл должен быть добавлен в проект (через " Добавить существующий элемент"), и AssemblyVersion а также AssemblyFileVersion линии должны быть удалены из AssemblyInfo.cs,

Различные алгоритмы изменения компонентов версии описаны в $(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.chm и свойства версии.

Я придумал решение, похожее на христианское, но вне зависимости от задач сообщества MSBuild, это не вариант для меня, так как я не хочу устанавливать эти задачи для всех наших разработчиков.

Я генерирую код и компилирую в сборку и хочу автоматически увеличивать номера версий. Однако я не могу использовать трюк VS 6.0.* AssemblyVersion, так как он автоматически увеличивает номера сборки каждый день и нарушает совместимость со сборками, которые используют более старый номер сборки. Вместо этого я хочу иметь жестко запрограммированную AssemblyVersion, но с автоматическим приращением AssemblyFileVersion. Я достиг этого, указав AssemblyVersion в AssemblyInfo.cs и сгенерировав VersionInfo.cs в MSBuild, например:

  <PropertyGroup>
    <Year>$([System.DateTime]::Now.ToString("yy"))</Year>
    <Month>$([System.DateTime]::Now.ToString("MM"))</Month>
    <Date>$([System.DateTime]::Now.ToString("dd"))</Date>
    <Time>$([System.DateTime]::Now.ToString("HHmm"))</Time>
    <AssemblyFileVersionAttribute>[assembly:System.Reflection.AssemblyFileVersion("$(Year).$(Month).$(Date).$(Time)")]</AssemblyFileVersionAttribute>
  </PropertyGroup>
  <Target Name="BeforeBuild">
    <WriteLinesToFile File="Properties\VersionInfo.cs" Lines="$(AssemblyFileVersionAttribute)" Overwrite="true">
    </WriteLinesToFile>
  </Target>

Это создаст файл VersionInfo.cs с атрибутом Assembly для AssemblyFileVersion, в котором версия соответствует схеме YY.MM.DD.TTTT с датой сборки. Вы должны включить этот файл в свой проект и построить с ним.

Существует визуальное расширение студии Automatic Versions, которое поддерживает Visual Studio 2012, 2013, 2015 и 2017.

Скриншоты

Установите надстройку версии сборки. Это дает вам больше контроля, чем опция *.

Чтобы получить номера версий, попробуйте

 System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
 System.Reflection.AssemblyName assemblyName = assembly.GetName();
 Version version = assemblyName.Version;

Чтобы установить номер версии, создайте / отредактируйте AssemblyInfo.cs

 [assembly: AssemblyVersion("1.0.*")]
 [assembly: AssemblyFileVersion("1.0.*")]

Также в качестве примечания, третье число - это количество дней, прошедшее с 1 февраля 2000 года, а четвертое - половина общего количества секунд в дне. Так что если вы компилируете в полночь, это должно быть ноль.

В Visual Studio 2019

Мне не хватило добавления

[assembly: AssemblyVersion("1.0.*")]

При сборке выкидывает эту ошибку

Указанная строка версии не соответствует требуемому формату


Решение

Формат был окончательно принят после того, как я установил Deterministic в False в project.csproj

<Deterministic>false</Deterministic>

Установка * в номере версии в AssemblyInfo или в свойствах проекта, как описано в других статьях, не работает со всеми версиями Visual Studio /.NET.

Afaik не работал в VS 2005 (но в VS 2003 и VS 2008). Для VS 2005 вы можете использовать следующее: Автоинкремент Сборка версии Visual Studio 2005 и номер редакции во время компиляции.

Но имейте в виду, что автоматическое изменение номера версии не рекомендуется для сборок со строгим именем. Причина заключается в том, что все ссылки на такую ​​сборку должны обновляться каждый раз, когда ссылочная сборка перестраивается из-за того, что ссылки на сборки со строгими именами всегда являются ссылкой на конкретную версию сборки. Сами Microsoft изменяют номер версии сборок.NET Framework, только если есть изменения в интерфейсах. (Примечание: я все еще ищу ссылку в MSDN, где я ее прочитал.)

Как получить версию {major}.{year}.1{date}.1{time}

Это своего рода эксперимент, но мне это нравится. Вдохновлено Джеффом Этвудом @ CodingHorror ( ссылка).

Полученный номер версии становится 1.2016.10709.11641 (имеется в виду 2016-07-09 16:41), что позволяет

  • Бедный ноль дополнения (с тупой ведущей 1s)
  • Почти человекочитаемый локальный DateTime, встроенный в номер версии
  • оставив Major версию в покое для действительно серьезных изменений.

Добавьте новый элемент в ваш проект, выберите "Основные" -> "Текстовый шаблон", назовите его как-то так: CustomVersionNumber и (где это применимо) закомментировать AssemblyVersion а также AssemblyFileVersion в Properties/AssemblyInfo.cs,

Затем, при сохранении этого файла или создании проекта, это восстановит .cs файл, расположенный как подпункт под созданным .tt файл.

<#@ template language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>

//
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
//

using System.Reflection;

<#
    var date = DateTime.Now;
    int major = 1;
    int minor = date.Year;
    int build = 10000 + int.Parse(date.ToString("MMdd"));
    int revision = 10000 + int.Parse(date.ToString("HHmm"));
#>

[assembly: AssemblyVersion("<#= $"{major}.{minor}.{build}.{revision}" #>")]
[assembly: AssemblyFileVersion("<#= $"{major}.{minor}.{build}.{revision}" #>")]

Получить инкрементную (DateTime) информацию в свойство AssemblyFileVersion, преимущество которого состоит в том, что она не нарушает никаких зависимостей.


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

Pre-Build-Event:

echo [assembly:System.Reflection.AssemblyFileVersion("%date:~-4,4%.%date:~-7,2%%date:~-10,2%.%time:~0,2%%time:~3,2%.%time:~-5,2%")] > $(ProjectDir)Properties\VersionInfo.cs

Включите полученный файл VersionInfo.cs (подпапка "Свойства") в ваш проект.

Код для возврата даты (годы до секунд):

var version = assembly.GetName().Version;
var fileVersionString = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location).FileVersion;
Version fileVersion = new Version(fileVersionString);
var buildDateTime = new DateTime(fileVersion.Major, fileVersion.Minor/100, fileVersion.Minor%100, fileVersion.Build/100, fileVersion.Build%100, fileVersion.Revision);

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

Например, вы можете сделать его умнее, если обновляете файл VersionInfo.cs только каждые несколько минут / часов (используя временный файл, а затем копируете / перезаписываете настоящий VersionInfo.cs, если обнаружено достаточно большое изменение). Я сделал это когда-то довольно успешно.

Он находится в свойствах вашего проекта в разделе " Опубликовать".

http://screencast.com/t/Vj7rhqJO
(~ http://screencast.com/t/Vj7rhqJO)

Установите номер версии на "1.0.*", И он будет автоматически заполнять последние два числа с датой (в днях с некоторой точки) и временем (полсекунды с полуночи)

Cake поддерживает исправление файлов AssemblyInfo. С тортом в руках у вас есть бесконечные способы реализовать автоматическое увеличение версии.

Простой пример увеличения версии, как это делает компилятор C#:

Setup(() =>
{
    // Executed BEFORE the first task.
    var datetimeNow = DateTime.Now;
    var daysPart = (datetimeNow - new DateTime(2000, 1, 1)).Days;
    var secondsPart = (long)datetimeNow.TimeOfDay.TotalSeconds/2;
    var assemblyInfo = new AssemblyInfoSettings
    {
        Version = "3.0.0.0",
        FileVersion = string.Format("3.0.{0}.{1}", daysPart, secondsPart)
    };
    CreateAssemblyInfo("MyProject/Properties/AssemblyInfo.cs", assemblyInfo);
});

Вот:

  • Версия - это сборочная версия. Рекомендуется блокировать основной номер версии и оставлять оставшиеся с нулями (например, "1.0.0.0").
  • FileVersion - это версия файла сборки.

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

Перейти к проекту | Свойства, затем Информация о сборке, а затем Версия сборки и поместите * в поле последнего или второго до последнего (вы не можете автоматически увеличивать компоненты Major или Minor).

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

  1. Скачать приложение
  2. добавьте следующую строку в командную строку события pre-build

    C:\temp\IncrementFileVersion.exe $(SolutionDir)\Properties\AssemblyInfo.cs

  3. Постройте проект

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

Примечание. Чтобы заполнить поля, вам придется перезагрузить решение в Visual Studio для кнопки "Информация о сборке", однако ваш выходной файл будет иметь обновленную версию.

Для предложений и запросов, пожалуйста, напишите мне по адресу telson_alva@yahoo.com

На данный момент, для моего заявления,

string ver = Application.ProductVersion;

возвращается ver = 1.0.3251.27860

Значение 3251 - это количество дней с 01.01.2000. Я использую его, чтобы поместить дату создания версии на заставку моего приложения. Имея дело с пользователем, я могу задать дату создания, с которой легче общаться, чем какой-либо длинный номер.

(Я работаю в одиночном отделении, поддерживаю небольшую компанию. Этот подход может не сработать для вас.)

Возможно, для этой задачи вы можете использовать такой код:

    private bool IncreaseFileVersionBuild()
    {
        if (System.Diagnostics.Debugger.IsAttached)
        {
            try
            {
                var fi = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory).Parent.Parent.GetDirectories("Properties")[0].GetFiles("AssemblyInfo.cs")[0];
                var ve = System.Diagnostics.FileVersionInfo.GetVersionInfo(System.Reflection.Assembly.GetExecutingAssembly().Location);
                string ol = ve.FileMajorPart.ToString() + "." + ve.FileMinorPart.ToString() + "." + ve.FileBuildPart.ToString() + "." + ve.FilePrivatePart.ToString();
                string ne = ve.FileMajorPart.ToString() + "." + ve.FileMinorPart.ToString() + "." + (ve.FileBuildPart + 1).ToString() + "." + ve.FilePrivatePart.ToString();
                System.IO.File.WriteAllText(fi.FullName, System.IO.File.ReadAllText(fi.FullName).Replace("[assembly: AssemblyFileVersion(\"" + ol + "\")]", "[assembly: AssemblyFileVersion(\"" + ne + "\")]"));
                return true;
            }
            catch
            {
                return false;
            }
        }
        return false;
    }

и позвоните из загрузки формы.
С помощью этого кода вы можете обновить любую часть информации о файле в AssemblyInfo.cs (но вы должны использовать "стандартную" структуру каталогов).

Используйте задачу AssemblyInfo из проекта Задачи сообщества MSBuild ( http://msbuildtasks.tigris.org/) и интегрируйте ее в свой файл.csproj /.vbproj.

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

Рекомендуемые.

Изменение AssemblyInfo работает в VS2012. Кажется странным, что в Visual Studio больше нет такой поддержки, можно подумать, что это была основная часть процесса сборки / выпуска.

Возможно, уже слишком поздно, чтобы ответить здесь, но надеюсь, что это решит чью-то беспокойную проблему.

Автоматический способ изменить версию сборки всех ваших проектов с помощью скрипта PowerShell. Эта статья решит многие ваши проблемы.

Я пробовал это с Visual Studio 2019, и это не сработало. В более новых версиях VS, по крайней мере, детерминированный флаг предотвращает автоматическое обновление. Но изменив 14-ю строку Your-project-name.csproj на<Deterministic>false</Deterministic>и изменение строки номера версии на «1.0.*» мне не помогло.

Поэтому я сделал небольшой скрипт vbs, который выполняет эту работу. он изменяет номер версии на (основная версия).(дополнительная версия).([год][деньгода]).(приращение).

Скопируйте скрипт в папку и поместите следующее в командную строку предварительной компиляции сборки:

      "Path-to-this-script\UpdateVersion.vbs"  "$(ProjectDir)"

(включая кавычки и заполнение реального пути Вашей машины) и все готово.

Получить его здесь:https://github.com/abtzero/VS_UpdateVersion.git

AssemblyInfoUtil. Свободно. Открытый исходный код.

Я использую этот подход /questions/10364498/kak-poluchit-avtomaticheski-uvelichivayuschijsya-nomer-versii-visual-studio/10364519#10364519, помещая шаблон T4 в "Элементы решения" и используя его с "Добавить как ссылку" в каждом проекте.

Любой, кто использует Tortoise Subversion, может связать один из номеров своей версии с номером версии Subversion исходного кода. Я считаю это очень полезным (аудиторам это тоже нравится!). Вы делаете это, вызывая утилиту WCREV в вашей предварительной сборке и генерируя свой AssemblyInfo.cs из шаблона.

Если ваш шаблон называется AssemblyInfo.wcrev и находится в обычном каталоге AssemblyInfo.cs, а черепаха находится в каталоге установки по умолчанию, то ваша команда Pre-Build выглядит следующим образом (NB All в одной строке):

"C:\Program Files\TortoiseSVN\bin\SubWCRev.exe" "$(ProjectDir)." "$(ProjectDir)Properties\AssemblyInfo.wcrev"  "$(ProjectDir)Properties\AssemblyInfo.cs"

Файл шаблона будет включать строку подстановки токена wcrev: $WCREV$
eg.

[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]

Примечание.
Поскольку ваш AssemblyInfo.cs теперь создается, вы не хотите, чтобы он контролировал версию.

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

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

Если вы используете Git + TortoiseGit, есть очень простой способ обновить файл AssemblyInfo.cs и обновить значения AssemblyVersion и AssemblyFileVersion с указанием количества коммитов git.

  1. Скопируйте файл AssemblyInfo.cs и назовите его AssemblyInfo.template .
  2. Закомментируйте строки ниже в файле AssemblyInfo.cs:
      //[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyFileVersion("1.0.*")]</pre>
  1. Измените эти строки в файле AssemblyInfo.template следующим образом:
      [assembly: AssemblyVersion("1.0.1.$WCLOGCOUNT$")]
[assembly: AssemblyFileVersion("1.0.1.$WCLOGCOUNT$")]
  1. Добавьте эту строку в события prebiuld вашего проекта :
      GitWCRev "$(ProjectDir)\" "$(ProjectDir)Properties\AssemblyInfo.template" "$(ProjectDir)Properties\AssemblyInfo.cs"

Теперь (даже если вы используете конфигурацию отладки) ваш файл AssemblyInfo.cs будет создан следующим образом:

      [assembly: AssemblyVersion("1.0.1.444")]
[assembly: AssemblyFileVersion("1.0.1.444")]

И вы готовы.

Другие вопросы по тегам