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

301

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

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

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

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

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

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

EDIT: Он не работает в VS2005, насколько я могу судить (http://www.codeproject.com/KB/dotnet/AutoIncrementVersion.aspx)

  • 1
    Кажется, что подстановочные знаки работают только для AssemblyVersion, но не для AssemblyFileVersion в VS 2005
  • 0
    Есть ли какие-либо решения для этого, которые работают для проектов C ++ в VS2005? Все ответы, похоже, связаны с .Net. Смежный вопрос . Спасибо
Показать ещё 1 комментарий
Теги:
visual-studio
version-control
assemblyinfo

24 ответа

381
Лучший ответ

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

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

[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

  • 2
    Это работает так же хорошо, как и все остальное, и работает в VS2005. Я надеялся на какое-то рациональное число, например 1.0.1.56, вместо этого я получаю 1.0.3266.30135, но по крайней мере оно увеличивается (хотя и на какое-то случайное число: D)
  • 14
    о, я просто прочитал это: он автоматически заполнит последние два числа датой (в днях с некоторой точки) и временем (половина секунды с полуночи)
Показать ещё 11 комментариев
151

откройте файл 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, перейдя в проект → свойства → информация о сборке

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

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

если вы попытаетесь поместить * в поле версии файла.

Итак, просто откройте сборкуinfo.cs и сделайте это вручную.

  • 0
    Да, я только что столкнулся с "" Версия файла сборки: подстановочный знак ("*") не разрешен в этом поле ", вот что выиграло ваш метод зеленую галочку: D
  • 0
    Это работает в VS2008?
Показать ещё 13 комментариев
50

Другим вариантом изменения номеров версий в каждой сборке является использование задачи Версии 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 и Version Properties.

  • 2
    Это лучший способ, который я когда-либо видел, чтобы обойти тот ужасный факт, что структуры FileVersion используют 16-битные целые числа.
  • 1
    У меня были проблемы с установкой в VS2012 с помощью консоли пакетов, поэтому рекомендуем использовать загруженные ночные установщики MSI по адресу github.com/loresoft/msbuildtasks/downloads . Работает копирование / вставка из вышеперечисленного. Спасибо!
Показать ещё 3 комментария
18

Я придумал решение, подобное христианам, но не в зависимости от задач Community 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 с датой сборки. Вы должны включить этот файл в свой проект и построить с ним.

  • 0
    MSBuild поддерживает переменные? Было бы лучше поместить [System.DateTime]::Now в единое целое, в противном случае есть условие гонки, которое может привести к использованию старого номера сборки при построении около полуночи.
  • 0
    Вы определили эти четыре свойства вместо того, чтобы объединить их в одном DateTime.ToString для демонстрационных целей, или есть конкретная причина?
16

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

  • 0
    Только для VS2005 / 2008, с бета-версией для VS2010
  • 0
    autobuildversion.codeplex.com/discussions/393154 Ссылка DropBox в конце потока, начиная с r3mote203, предназначена для 2010 года и работает в 2012 году (и, возможно, в 2013 году).
Показать ещё 1 комментарий
12

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

 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.*")]

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

8

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

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

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

  • 0
    Я думаю, что для любой версии VS вы можете поместить только * в поля Build или Revision. Я только что попробовал это с использованием VS 2005, и он отлично работает. Я не уверен, о чем говорит автор этой статьи проекта кода.
  • 0
    Может быть, он вернулся с пакетом обновления, но я помню, что он не работал, когда я использовал VS 2005.
Показать ещё 4 комментария
5

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

Экранные снимки Изображение 5944

Изображение 5945

  • 2
    Это не работает для меня в 2017 году!
  • 0
    Так что я удалил его, и я могу сказать даже больше ... он изменяет оригинальный файл csproj. Я думаю, что это очень проблемное расширение.
Показать ещё 1 комментарий
5

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

  • 0
    эй, если бы я прочитал это правильно в начале, я бы спас себя Mucho Agro. Спасибо
4

Чтобы получить инкрементную (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, если обнаружено достаточно большое изменение). Я сделал это очень успешно.

4

Это в ваших свойствах проекта в Опубликовать

Изображение 5946
(~ http://screencast.com/t/Vj7rhqJO)

3

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

Простой пример инкрементной версии, такой как компилятор С#:

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 - это версия файла сборки.

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

3

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

2

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

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

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

  • бедный mans zero padding (с глупым ведущим 1 s)
  • доступный для чтения локальный DateTime, встроенный в номер версии
  • оставление основной версии только для действительно серьезных изменений.

Добавьте новый проект в свой проект, выберите "Общие" → "Текстовый шаблон", назовите его что-то вроде 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}" #>")]
  • 0
    Вы не компилируете свою программу каждую минуту или развертываете чаще, чем один раз в день, поэтому технически временная часть неоправданно занимает ценную информацию, я бы использовал 1-е и 2-е для старшего несовершеннолетнего и просто использовал 3-е число для даты yyddd (двузначный год + ddd день с начала того же года) и оставьте 4-й для дополнительного номера сборки.
2

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

2

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

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

Рекомендуется.

2

Как сейчас, для моего приложения

string ver = Application.ProductVersion;

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

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

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

  • 0
    Ваш номер скоро закончится. Я бы использовал yyddd, который представляет собой двухзначный год и трехзначный день от начала года, то есть максимум 365. По крайней мере, ваша программа будет скомпилирована до 2065 года. Тогда вы выйдете на пенсию и позволите кому-то еще выяснить, как они хотят с этим справиться. учитывая, что ваша программа все еще в комиссии на эту дату!
1

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

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

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

Я использую этот подход https://stackoverflow.com/questions/826777/how-to-have-an-auto-incrementing-version-number-visual-studio, поместив шаблон T4 в "Элементы решения" и используя его с "Добавить как ссылку" в каждом проекте.

1

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

1

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

    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(но вы должны использовать "стандартную" структуру каталогов).

0

В .NET информация о версии сборки приведена в следующем формате - [...].

Этот формат версии состоит из четырех значений:

Major Version
Minor Version
Build Number
Revision

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

Когда мы компилируем или создаем наш код в .NET(используя Visual studio), он выводит сборки, и эта сборка может быть помечена тремя различными типами версий, которые следующие:

Assembly Version
Assembly File Version
Assembly Informational Version

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

Попробуйте это решение с видео, нажмите здесь

0

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

  • Загрузите Приложение
  • добавьте следующую строку для предварительной сборки командной строки событий

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

  • Постройте проект

Чтобы это было просто, приложение выводит только сообщения, если есть ошибка, чтобы убедиться, что это сработало нормально, вам нужно будет проверить версию файла в "Информация сборки"

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

Для предложений и запросов, пожалуйста, напишите мне по адресу [email protected]

0

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

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

  • 1
    VS отвечает за увеличение последнего номера, который обычно является номером сборки. Все остальное (то есть цифры до этого) зависит от вас, потому что они представляют версию вашего приложения.
  • 1
    Огњен Шобајић: Не совсем верно. Схема нумерации Microsoft - major.minor.build.revision, например, 1.0.4.7. Если вы установите версию сборки на что-то вроде «1.0. *», Тогда VS установит для вас номера сборки и ревизии. В этом случае сборка будет увеличиваться ежедневно, а редакцией будет количество секунд с полуночи, деленное на 2.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню