Как управлять разными репозиториями для разных клиентов с одним и тем же проектом?

Доброе утро, мне нужно управлять проектом Django, где каждый клиент имеет небольшие настройки, как в плане приложений, так и конечных точек API. Я хотел бы избежать необходимости управлять слишком большим количеством ветвей для каждого отдельного клиента. Некоторые потенциальные решения, которые я придумал, следующие:

Первое решение

В файл .env добавьте поле, указывающее на клиента CUSTOMER=customer1

#settings.py
#...
INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "rest_framework",
    "rest_framework_simplejwt",

]

customer = os.getenv("CUSTOMER")

if customer == "customer1":
    INSTALLED_APPS.append('custom_customer1')

Второе решение

Используйте различные ветки в зависимости от клиента, с различными слияниями из master/main

develop --> master --> customer1_develop --> customer1_master

Идея может заключаться в том, чтобы хранить список приложений для добавления в INSTALLED_APPS в переменной окружения CUSTOMER:

# settings.py

import ast

# …

customer = os.getenv('CUSTOMER', '[]')

INSTALLED_APPS += ast.literal_eval(customer)

, поэтому мы сохраняем ['custom_customer1'] в переменной окружения CUSTOMER.

Одним из решений этой проблемы является создание проекта в виде многократно используемого приложения (или набора многократно используемых приложений). Например, вы создадите приложения под названием myproject_component_a, myproject_component_b и т. д., а затем для каждого клиента вы создадите отдельный Django-проект (возможно, с собственным git-репозиторием), который будет использовать эти приложения.

В их настройках вы добавите свои приложения следующим образом:

INSTALLED_APPS = [
    "myproject_component_a.apps.MyprojectComponentAConfig",
    "myproject_component_b.apps.MyprojectComponentBConfig",
    ...,
]

Чтобы включить URL-адреса, можно сделать следующее:

urlpatterns = [
    path("a/", include("myproject_component_a.urls")),
    path("b/", include("myproject_component_b.urls"))
    ...,
]

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

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

Вернуться на верх