Рекомендации/рекомендации по ведению номеров версий сборок


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

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

5 149

5 ответов:

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

предполагается, что вы используете систему управления версиями и строить сервер. Для контекста мы используем TeamCity и Subversion / Git. TeamCity является бесплатным для небольшого (10) количества проектов и является очень хорошим сервером сборки, но есть и другие, некоторые из которых полностью бесплатны.

что означает номер версии

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

Major.Minor.Build.Revision

  • Revision это номер, взятый из системы управления версиями, чтобы определить, что был фактически построен.
  • Build Это все большее число, которое может быть использовано найти конкретная сборка на сервере сборки. Это важное число, потому что возможно, сервер сборки построил то же самое источник дважды с различным набором параметры. Использование номера сборки в вместе с номером источника позволяет определить, что было построено и как.
  • Minor Это должно измениться только тогда, когда есть значительное изменение общий интерфейс. Например, если это API, будет ли потреблять код по-прежнему в состоянии скомпилировать? Этот номер должен быть сброшен к нулю, когда основное число изменяется.
  • Major указывает, что версия продукт, на котором вы находитесь. Например Главный из всех VisualStudio 2008 сборки 9 и VisualStudio 2010 это 10.

исключение из правил

всегда есть исключения из правила, и вам придется адаптироваться, когда вы столкнетесь с ними. Мой первоначальный подход был основан на использовании subversion, но недавно я перешел на Git. Управления исходным кодом, такие как Subversion и source safe, которые используют центральный репозиторий, имеют номер, который можно использовать для идентификации определенного набора источников с заданного времени. Это не относится к распределенному управлению версиями, такому как Git. Поскольку Git использует распределенные репозитории, которые находятся на каждой машине разработки, нет автоматического увеличения числа, которое вы можете использовать, есть хак, который использует количество проверок, но он уродлив. Из-за этого мне пришлось эволюционировать подход.

Major.Minor.Macro.Build

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

, что установлено

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

  • 1.2.0.0 (AssemblyVersion)
  • 1.2.3.4 (FileVersion)

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

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

Как подключить его вместе

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

  • удалить AssemblyVersion и AssemblyFileVersion атрибуты из всего проекта AssemblyInfo.cs файлы.
  • создайте общий файл информации о сборке (назовите его VersionInfo.цезий) и добавить его в качестве связанного элемента для всех ваших проектов.
  • добавить AssemblyVersion и AssemblyFileVersion атрибуты версии со значениями "0.0.0.0".
  • создайте проект MsBuild, который создает файл решения.
  • Добавить задачу перед сборкой, которая обновляет VersionInfo.цезий. Существует ряд библиотек MsBuild с открытым исходным кодом, которые включают задачу AssemblyInfo, которая может установить номер версии. Просто установите его на произвольное число и проверьте.
  • добавить a группа свойств, содержащая свойство для каждого из сегментов номера сборки. Здесь вы устанавливаете мажор и минор. Номер сборки и версии должен быть передан в качестве аргументов.

С subversion:

<PropertyGroup>
    <Version-Major>0</Version-Major>
    <Version-Minor>0</Version-Minor>
    <Version-Build Condition=" '$(build_number)' == '' ">0</Version-Build>
    <Version-Build Condition=" '$(build_number)' != '' ">$(build_number)</Version-Build>
    <Version-Revision Condition=" '$(revision_number)' == '' ">0</Version-Revision>
    <Version-Revision Condition=" '$(revision_number)' != '' ">$(revision_number)</Version-Revision>
</PropertyGroup>

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

[AssemblyVersion] - очень большое дело в философии. NET. One, поощряемой Microsoft, заключается в том, что вы позволяете ему автоматически увеличивать, заставляя все проекты, которые зависят от сборки, подлежащей перекомпиляции. Работает нормально, если вы используете сервер сборки. Это никогда не неправильно вещь, чтобы сделать, но остерегайтесь людей, несущих мечи.

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

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

Так что Microsoft проповедует не то, что он практик. Процесс сборки и контроль версий не имеет аналогов, у них даже есть специальный инженер, который контролирует процесс. Вышло не совсем так, метод waithandle.WaitOne (int) перегрузка в частности причинил изрядную боль. Фиксированной в .Net версии 4.0 с очень другой подход,но это становится немного за рамками.

Это скорее зависит от вас и вашей уверенности в том, насколько хорошо вы можете контролировать процесс сборки и циклы и отпустите, чтобы сделать свой собственный выбор. Кроме того, автоматическое увеличение [AssemblyFileVersion] автоматически очень уместно. Но неудобство в том, что это не поддержал.

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

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

в вашей среде тестовая версия-это версия, которая имеет версию сборки != 0. При выпуске вы увеличиваете второстепенную часть и устанавливаете часть сборки в 0, Вот как вы бы идентифицировали выпущенные сборки.

Если вы устанавливаете свои сборки в GAC, ваш GAC со временем заполняется множеством разных версий, поэтому имейте это в виду. Но если вы используете только библиотеки DLL на местном уровне, я думаю, что это хорошая практика.

добавлять к ответ Бронум-Скиса, Я хочу отметить, что после семантического стандарта Versioning 2.0 в semver.org,Major.Minor.Build.Revision было бы незаконным из-за правила, что после увеличения числа все регулярные значения справа должны быть сброшены до нуля.

лучший способ следовать стандарту - использовать Major.Minor+Build.Revision. Это obivously не для использования в AssemblyVersionAttribute, но вместо этого можно использовать пользовательский атрибут или статический класс.

Semver в TeamCity должен быть доступен с помощью блока питания Meta-runner. Для git с git-flow (особенно в мире .NET) я нашел GitVersion чтобы быть полезным.

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

... например : 1.0.0.*

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

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