В отличие от всех скептиков, давайте предположим, что это действительно необходимо для бизнеса.
(например, результат - это исходный код, клиенты принадлежат к одному и тому же бизнесу и поэтому являются конкурентами друг другу, а ваша бизнес-модель обещает сохранить свои секреты в секрете)
Кроме того, давайте предположим, что в вашей компании есть инструменты для поддержки всех филиалов, то есть либо рабочая сила (скажем, 100 разработчиков, занятых слиянием, предполагающих 5-дневную задержку выпуска, или 10 разработчиков, предполагающих 50-дневную задержку выпуска в порядке), или такое удивительное автоматическое тестирование, что автоматические слияния действительно проверяются как на базовую спецификацию, так и на спецификацию расширения в каждой ветви, и, таким образом, только изменения, которые не объединяются «чисто», требуют вмешательства человека. Если ваши клиенты платят не только за настройки, но и за их обслуживание, это может быть действительной бизнес-моделью.
Мой (и непослушный) вопрос: есть ли у вас специальный человек, ответственный за доставку каждому клиенту? Если вы, скажем, компания с 10000 человек, это может быть так.
В некоторых случаях это может быть обработано архитектурой плагинов , скажем, ваше ядро является транком, плагины могут храниться в транке или ветвях, а конфигурация для каждого клиента представляет собой файл с уникальным именем или хранится в ветке клиента.
Плагины могут быть загружены во время выполнения или встроены во время компиляции.
Поистине, многие проекты выполняются таким образом, в принципе все та же проблема: простые базовые изменения тривиальны для интеграции, конфликтные изменения необходимо либо откатить, либо изменения необходимы для многих плагинов.
Бывают случаи, когда плагины не достаточно хороши, поэтому нужно настроить так много внутренних компонентов ядра, что количество интерфейсов плагинов становится слишком большим для обработки.
В идеале это должно быть обработано аспектно-ориентированным программированием , где транк - это основной код, а ветки - это аспекты (то есть дополнительный код и инструкции, как подключить дополнительные компоненты к ядру).
В простом примере вы можете указать, что custom foo
запускается до или после ядра, klass.foo
или что он заменяет его, или который оборачивает его и может изменять ввод или вывод.
Для этого есть множество библиотек, однако проблема конфликтов слияний не исчезает - AOP занимается чистыми слияниями, а конфликты все еще требуют вмешательства человека.
Наконец, такой бизнес действительно должен заниматься обслуживанием филиала , а именно, является ли специфическая для клиента функция X настолько распространенной, что дешевле перенести ее в ядро, даже если за нее платят не все клиенты?