Упаковка приложения django с внешними зависимостями

Я думал о упаковке одного из моих проектов django в многоразовый пакет.

Как упаковать дается довольно красиво в https://docs.djangoproject.com/en/dev/intro/reusable-apps/ и, конечно, во многих других веб-сайтах.

что все это предлагает, это включить приложение re-suable в список INSTALLED_APPS вашего проекта django в settings.py.

круто, но у меня есть несколько (сторонних) зависимостей от проекта. Я должен сказать в документации, чтобы включить все эти пакеты в список INSTALLED_APPS!!

Я чувствую, что должен быть лучший способ, что вы просто включаете одно приложение, и все его зависимости добавляются в INSTALLED_APPS автоматически приложением.

теперь, позвольте мне привести пример ясности: (вы можете прочитать здесь)

  • проект A: является многоразовым приложением django
  • проект B & C: являются 3rd party django многоразовые Приложения, используемые проектом A (django-toolbar, reversion и т. д., например)
  • проект D: это ваш проект django, и вы хотите включить мой проект A в свое приложение.

теперь:

  • вы можете добавить " A " в свой INSTALLED_APPS
  • но вы также должны добавить "B" и "C", поскольку они являются зависимостями для "A"

мой вопрос: есть ли способ, с помощью которого при добавлении в проект включить "B" и " C " автоматически?

Это, как говорится, Я знаю, как добавить пользовательские настройки и обеспечить разумные значения по умолчанию. Это только то, что я не могу думать о своей голове над зависимой проблемой приложений (может быть, это потому, что это будет на следующий день)

2 ответов


я прибил его с install_requires опция в setup.py

у нас тоже есть и extras_require директива, которая все идет в setuptools.setup() Если вы используете distribute.

  • install_requires и extras_require оба являются списком требований (пакетов).
  • extras_require - это словарь с "тестированием", " doc " и т. д., являются ключами и списком требований как список.

они добавляются в распространение в версии 0.5a4

полезные ссылки:

  1. все опции
  2. extras_require

  1. проект A: (с внутренним приложением:c и внешних приложений: b):

    # Directory Tree:
    A
    ├── setup.py
    ├── a
    │   ├── apps        # internal dependencies
    │   │   ├── c
    │   │   │   ├── models.py
    │   │   │   ├── ...
    │   │   │   ├── app.py
    │   │   │   └── __init__.py
    │   │   └── __init__.py
    │   ├── core        # core library
    │   │   ├── __init__.py
    │   │   └── whatever.py
    │   ├── ...
    │   └── __init__.py # 
    ├── ...
    └── requirements.pip
    
    # File: A/requirements.pip
    # external dependencies: b
    
    b>=0.1,<0.2
    
    # File: A/setup.py
    setup(
        name="a",
        install_requires=["B",], # External Dependency
        ...
    )
    
    # File: A/a/__init__.py
    
    # to be added into INSTALLED_APPS later
    CORE_APPS = [
        "B",        # external apps
        "a.apps.C", # internal apps
    ]
    
    def get_core_apps():
        return CORE_APPS
    

    проект A может быть разработан как фреймворк / библиотека без реализации. Таким образом, он не имеет wsgi.py, manage.py, etc.... Но проект A может предоставить пример проекта (песочница или демо-проект).

  2. проект D (проект Django): (с приложением: a)

    # File: D/requirements.pip
    a>=0.1<0.2
    
    # File: D/d/settings.py
    import a
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    
        # ...
    
    ] + a.get_core_apps()
    

    проект D является реализацией проекта A. Таким образом, он может содержать settings.py, wsgi.py, etc....