У вас есть несколько вариантов, и они должны использоваться в комбинации.
- Превратить различия между A и B. в параметры конфигурации.
- Извлечь общие биты между A и B.
- Извлечение дополнительных функций в виде модулей.
Конфигурация может означать включение и выключение функций с помощью флагов конфигурации.Это также может означать наличие отдельных шаблонов для A и B. A и B становятся сохраненными конфигурациями.Это, вероятно, лучше всего подходит для изменений, которые в основном носят косметический характер, или если функции достаточно интегрированы в процесс, например, учетные данные базы данных и API.
Остальные биты будет иметь смысл извлекать в модули.Подклассы, позволяющие подключаться, например, к новым базам данных или API.
Изначально вы можете управлять всем этим как одним репозиторием.A и B могут быть такими же простыми, как отдельные каталоги в вашем хранилище.Это может выглядеть так.
base/
modules/
feature1/
feature2/
releases/
A/
config
templates/
B/
config
templates/
Все в одном репо просто и удобно.Это будет служить вам изначально, и это может быть все, что вам нужно.Но это поощряет тугое владение всем вместе.Зачем писать хорошо продуманный API, если вы можете просто изменить все сразу?
Если вы обнаружите, что вам нужно больше модульности, вы извлекли бы базу, каждый из модулей и каждый выпуск в свои собственные.хранилища.Это вызывает управление зависимостями.
Первоначально A и B могли включить свои зависимые базы и репозитории модулей как Подмодули Git .Это будет работать в краткосрочной перспективе, но это плохой способ управления зависимостями и, опять же, поощряет тесное связывание вещей.
Наконец, вы будете управлять каждым репозиторием отдельно как своим собственным проектом.Делайте выпуски так же, как и для любого проекта, использующего обычную систему вашего языка для распространения модулей (Ruby gems, Javascript npm, пакеты Python и т. Д.), Возможно, с использованием частного хранилища модулей.Затем A и B становятся установками, используя систему зависимостей вашего языка, чтобы выбрать, какие дополнительные функции устанавливать.
Для правильной настройки требуется некоторая практика, и для многих внутренних проектов полные выпуски и управление зависимостями излишни.Начните с реорганизации всего в подкаталоги в одном репозитории, это, вероятно, будет достаточно сложной задачей, и посмотрите, нужно ли вам больше.