Упаковка приложения 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
полезные ссылки:
-
проект 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 может предоставить пример проекта (песочница или демо-проект). -
проект 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....