Лучшие практики / руководство для поддержания номеров версий сборки

StackOverflow https://stackoverflow.com/questions/3768261

Вопрос

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

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

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

Решение

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

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

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

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

Major.Minor.Build.Revision

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

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

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

Major.Minor.Macro.Build

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

Что установить

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

  • 1.2.0.0 (Assockerversion)
  • 1.2.3.4 (Fileversion)

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

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

Как провести его вместе

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

  • Удалить AssemblyVersion а также AssemblyFileVersion Атрибуты из всех файлов Assalinfo.CS.
  • Создайте общий файл информации об общих монтаже (вызовите его версиюInfo.cs) и добавьте его как связанный элемент для всех ваших проектов.
  • Добавлять AssemblyVersion а также AssemblyFileVersion Атрибуты версии со значениями «0,0.0,0».
  • Создайте проект MSBuild, который создает файл вашего решения.
  • Добавьте в задачу до сборки, которая обновляет версиюInfo.cs. Существует несколько библиотек MSBuild Source Source, которые включают задачу AssemblyInfo, которая может установить номер версии. Просто установите его на произвольное количество и тест.
  • Добавьте группу свойств, содержащей свойство для каждого из сегментов номера сборки. Это где вы устанавливаете основные и незначительные. Номер сборки и ревизии должен быть передан в качестве аргументов.

С 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>

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

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

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

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

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

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

Он скорее до вас и ваша уверенность в том, насколько хорошо вы можете контролировать процесс сборки и циклы выпуска, чтобы сделать свой собственный выбор. Кроме того, автоматически выравнивание [Assockilversion] автоматически является очень подходящим. С того, что неудобства, которые это нет поддерживается.

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

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

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

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

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

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

Semver в TeamCity должен быть доступен с использованием Power Power Meta-Runner. Для Git с Git-потоком (особенно в .NET World), я нашел Гитверсия быть полезным.

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

... для ex: 1.0.0. *

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

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

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