Очень осторожно
Возможность ветвления является опцией, но я нахожу ее несколько тяжелой. Кроме того, это облегчает глубокие модификации, которые могут привести к разветвлению вашего приложения, если не держать его под контролем. В идеале вы хотите максимально расширить настройки, чтобы ваша базовая кодовая база была как можно более общей и универсальной.
Вот как бы я это сделал, хотя я не знаю, применимо ли это к вашей кодовой базе без серьезных модификаций и перефакторинга. У меня был похожий проект, в котором основные функции были одинаковыми, но каждому клиенту требовался очень специфический набор функций. Я создал набор модулей и контейнеров, которые я затем собираю через конфигурацию (как IoC).
затем для каждого клиента я создал проект, который в основном содержит конфигурации и скрипт сборки для создания полностью настроенной установки для их сайта. Иногда я размещаю там также некоторые компоненты, сделанные на заказ для этого клиента. Но это редко, и, когда это возможно, я стараюсь сделать это в более общей форме и надавить, чтобы другие проекты могли их использовать.
В результате я получил необходимый уровень настройки, я получил индивидуальные сценарии установки, так что, когда я попадаю на сайт клиента, я не выгляжу так, как будто я постоянно настраиваю систему, и в качестве дополнительного ОЧЕНЬ существенного бонуса я получаю чтобы иметь возможность создавать регрессионные тесты, подключенные непосредственно к сборке. Таким образом, в любое время, когда я получаю ошибку, специфичную для клиента, я могу написать тест, который будет утверждать систему по мере ее развертывания и, таким образом, сможет выполнять TDD даже на этом уровне.
так вкратце:
- Сильно модульная система с плоской структурой проекта.
- Создайте проект для каждого профиля конфигурации (клиент, хотя более одного может поделиться профилем)
- Соберите необходимые наборы функций как другой продукт и относитесь к нему как к такому.
Если все сделано правильно, ваша сборка продукта должна содержать все файлы конфигурации, кроме нескольких.
Некоторое время спустя я использовал это для создания метапакетов, которые собирают наиболее часто используемые или необходимые системы в качестве основного модуля и используют этот метапакет для пользовательских сборок. Через несколько лет у меня появился большой набор инструментов, который я мог собрать очень быстро для создания решений для клиентов. В настоящее время я изучаю Spring Roo и вижу, не смогу ли я продвинуть эту идею немного дальше, надеясь, что однажды я смогу создать первый черновик системы прямо у клиента в нашем первом интервью ... Я думаю, вы могли бы назвать его «Управляемый пользователем». Разработка ;-).
Надеюсь, это помогло
#ifdef
тебя работает?