Можно ли автоматически увеличивать версию сборки файла при использовании Visual Studio? - PullRequest
339 голосов
/ 10 декабря 2008

Мне было просто интересно, как можно автоматически увеличить сборку (и версию?) Моих файлов с помощью 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

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

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

Ответы [ 24 ]

413 голосов
/ 10 декабря 2008

В 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

149 голосов
/ 10 декабря 2008

откройте файл 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 и сделайте это вручную.

52 голосов
/ 15 января 2010

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

24 голосов
/ 24 июня 2011

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

16 голосов
/ 22 апреля 2009

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

12 голосов
/ 10 декабря 2008

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

 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 года, а четвертое - половина общего количества секунд в дне. Так что если вы компилируете в полночь, это должно быть ноль.

9 голосов
/ 30 марта 2017

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

Снимки экрана enter image description here

enter image description here

8 голосов
/ 10 декабря 2008

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

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

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

6 голосов
/ 10 июля 2012

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

5 голосов
/ 10 декабря 2008

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

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