Версии нескольких связанных библиотек NuGet с GitVersion. MonoRepo или MultiRepo?

Нужно посоветовать следующее:

В моей компании я занимаюсь разработкой библиотек классов.NET, которые будут использоваться внешними заинтересованными сторонами, и делюсь ими в частном фиде NuGet, к которому заинтересованные стороны имеют доступ.

Библиотеки зависят от одной базовой библиотеки, как показано ниже. В настоящее время я поддерживаю эти библиотеки в одном решении VS, очевидно, в одном репозитории Git. Я слежу за SemVer для их версии.

CoreLibrary
CoreLibrary.Extension1 (references CoreLibrary as project reference)
CoreLibrary.Extension2 (references CoreLibrary as project reference)
...
There might be more of these extension libraries in the near future

До сих пор я всегда вручную версировал их из Visual Studio (вручную устанавливая правильные значения в AssemblyInfo.cs всякий раз, когда мне нужно увеличить версию) и использовал пакетный файл в каждом проекте для упаковки и передачи этой конкретной библиотеки в NuGet.

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

Но вот но. Если я правильно понимаю, GitVersion работает на уровне хранилища, поэтому данная версия полуверсии, рассчитанная GitVersion, применяется ко ВСЕМ сборкам / библиотекам в хранилище, верно?

Итак, что вы предлагаете для выпуска и стратегий управления версиями для этих библиотек?

1) Храните все как сейчас в одном решении и репо, и всякий раз, когда в одном пакете требуется изменение (например, CoreLibrary.Extension1), это создает пакет NuGet для всех остальных библиотек. Так что, если все пакеты на 1.0.0 и есть одно небольшое изменение в одном из них, они все будут подняты до v1.1.0 и все упакованы и отправлены?

2) Создайте git-репо для каждого проекта и позвольте GitVersion воздействовать на каждое из них в отдельности. Ссылка на CoreLibrary через NuGet в библиотеках расширений.

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

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

Установка моих первых шагов в автоматических сборках и выпусках, так что любые советы более чем приветствуются.

Спасибо

2 ответа

Решение

Вы должны учитывать как минимум эти два фактора:

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

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

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

Теперь вот где у меня есть кость, чтобы выбрать ваше предположение о том, что вам нужно отдельное хранилище для каждого пакета Nuget или что GitVersion "работает на уровне хранилища". Как правило, большая часть документации и почти все примеры, которые вы найдете, определенно относятся к одному формату продукта / пакета / репозитория, и я, вероятно, рекомендую это в большинстве случаев, но на самом деле это не является жестким требованием. GitVersion функционирует на уровне ветки, и вам определенно следует заняться разработкой для разных библиотек в разных ветках, если не для разных репозиториев. Наличие основной ветки для объединения всего, вероятно, также является хорошей идеей, но даже мастер не требуется для Git или GitVersion. Вы можете иметь несколько VS-решений и проектов в одном git-репо, и вы можете создавать из них несколько пакетов nuget. Я не говорю, что вы должны, я говорю, что это не редкая практика, по крайней мере, для нетривиальных производственных линий.

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

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

Пройдя по одному пути репо / проекта / пакета / release-stream, вы быстро разработаете автоматизацию, необходимую для ее обслуживания. Это похоже на чистые методы кодирования, немного болезненные, когда вы только начинаете, но в конечном итоге это становится второй натурой, и отдача в будущем может быть огромной. Имейте в виду, что нет никаких причин, по которым вы не можете иметь несколько репозиториев с их собственными решениями и проектами, а также иметь решение VS в родительском каталоге на один уровень выше, что дает вам полностью интегрированную сборку. Просто подумайте об этом как об иерархии систем сборки. Вам просто нужно научиться пользоваться своим .gitignore подмодули file или git (я предпочитаю первый, так как инструменты для последующего слабы).

Я настоятельно рекомендую не использовать какой-либо пакет nuget здесь. Nuget был задуман как способ управления зависимостями стороннего программного проекта, а не как способ управления вашим взаимосвязанным кодом, который вы регулярно создаете. Для этого вам лучше иметь один репозиторий, одно решение для Visual Studio и один стек сборки, из которого вы собираете / разворачиваете.

Если вам нужно использовать Nuget, просто сделайте один пакет с одной версией.

Другие вопросы по тегам