Ответ 1
Версии - это то, о чем я очень увлечен и долгое время пытался придумать простую в использовании систему управления версиями. Из того, что вы уже сказали в своем вопросе, ясно, что вы поняли один важный момент, номера версий сборки не являются синонимами версии продукта. Один из них технически управляется, а другой управляется бизнесом.
Далее предполагается, что вы используете какую-то форму управления версиями и сервер сборки. Для контекста мы используем TeamCity и Subversion/Git. TeamCity является бесплатным для небольшого (10) проектов и является очень хорошим сервером сборки, но есть и другие, некоторые из которых полностью бесплатны.
Что означает номер версии
То, что версия означает для одного человека, может означать что-то другое, другое - основная, второстепенная, макро, микро. То, как я смотрю номер версии, состоит в том, чтобы разбить ее на две части. В первом полугодии описывается основная версия (Major) и любые обновления ключей (Minor). Вторая половина указывает, когда она была построена и какова версия исходного кода. Номера версий также означают разные вещи в зависимости от контекста: API, веб-приложение и т.д.
Major
. Minor
. Build
. Revision
-
Revision
Это номер, взятый из источника управления, чтобы определить, что был фактически построен. -
Build
Это постоянно растущее число, которое можно использовать для поиска особенно на сервере сборки. Это важное число, поскольку сервер сборки, возможно, построил тот же источник дважды с другим набором параметры. Использование номера сборки в соединение с исходным номером позволяет определить, что было построено и как. -
Minor
Это должно измениться только при значительном изменении открытый интерфейс. Например, если это API, потребляющий код по-прежнему может скомпилировать? Это число должно быть reset равным нулю при изменении основного номера. -
Major
указывает, какая версия продукт, на котором вы находитесь. Например, Основные возможности VisualStudio 2008 сборки - 9 и VisualStudio 2010 составляет 10.
Исключение из правила
Всегда есть исключения из правила, и вам придется адаптироваться, когда вы сталкиваетесь с ними. Мой оригинальный подход был основан на использовании подрывной деятельности, но в последнее время я перешел на Git. Элемент управления источником, такой как подрывная и исходная безопасность, который использует центральный репозиторий, имеет число, которое может использоваться для идентификации определенного набора источников с определенного времени. Это не относится к управлению распределенным источником, например, Git. Поскольку Git использует распределенные репозитории, которые находятся на каждой машине разработки, нет автоматического увеличивающего числа, которое вы можете использовать, есть хак, который использует количество проверок, но он уродлив. Из-за этого мне пришлось развивать свой подход.
Major
. Minor
. Macro
. Build
Теперь номер ревизии исчез, сборка смещена на место, где была сделана ревизия, и макрос был вставлен. Вы можете использовать макрос, как вы считаете нужным, но большую часть времени я оставляю его в покое. Поскольку мы используем TeamCity, информация, потерянная из номера версии, может быть найдена в сборке, это означает, что есть двухэтапный процесс, но мы ничего не потеряли и приемлемый компромисс.
Что устанавливать
Первое, что нужно понять, это то, что версия сборки, версия файла и версия продукта не должны совпадать. Я не сторонник наличия разных наборов чисел, но это облегчает жизнь при внесении небольших изменений в сборку, которая не влияет на какие-либо общедоступные интерфейсы, которые вы не вынуждены перекомпилировать зависимые сборки. Способ, которым я занимаюсь этим, заключается в том, чтобы установить только основные и младшие номера в версии сборки, но установить все значения в версии файла. Например:
- 1.2.0.0 (AssemblyVersion)
- 1.2.3.4 (FileVersion)
Это дает вам возможность запускать горячие исправления, которые не нарушают существующий код, потому что версии сборки не совпадают, но позволяют видеть ревизию/сборку сборки, просматривая ее номер версии файла. Это общий подход и можно увидеть на некоторых сборках с открытым исходным кодом, когда вы смотрите детали сборки.
Вы, как руководитель команды, должны будете нести ответственность за увеличение второстепенного числа, когда требуется перерыв. Одним из решений для развертывания требуемого изменения интерфейса, но не нарушением предыдущего кода, является то, что он является устаревшим и создает новый интерфейс. Это означает, что существующий код предупреждается о том, что метод устарел и может быть удален в любое время, но не требует немедленного разорвать его. Затем вы можете удалить устаревший метод, когда все было перенесено.
Как подключить его вместе
Вы можете сделать все вышеперечисленное вручную, но это будет очень трудоемким, вот как мы автоматизируем процесс. Каждый шаг выполняется.
- Удалите
AssemblyVersion
иAssemblyFileVersion
атрибуты из всех файлов AssemblyInfo.cs проекта. - Создайте общий информационный файл сборки (назовите его VersionInfo.cs) и добавьте его как связанный элемент во все ваши проекты.
- Добавить
AssemblyVersion
иAssemblyFileVersion
атрибуты к версии со значениями "0.0.0.0". - Создайте проект MsBuild, который создает файл решения.
- Добавить в задачу перед сборкой, которая обновляет VersionInfo.cs. Существует множество библиотек MsBuild с открытым исходным кодом, которые включают задачу 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>
Надеюсь, я был ясен, но есть много всего. Пожалуйста, задавайте любые вопросы. Я буду использовать любую обратную связь, чтобы разместить более краткое сообщение в блоге.