打包具有外部依赖关系的django应用程序

时间:2013-09-16 23:06:50

标签: django packaging

我正在考虑将我的django项目打包成一个可重复使用的软件包。

如何在https://docs.djangoproject.com/en/dev/intro/reusable-apps/,当然还有许多其他网站上很好地提供包装。

所有这些建议是在您的django项目的settings.py中包含可恢复的应用程序的INSTALLED_APPS列表。

很酷,但我对该项目的多重(第三方)依赖项。我是否应该在文档中说明在INSTALLED_APPS列表中包含所有这些包!!

我觉得应该有更好的方法,你只需要包含一个应用程序,并且应用程序会自动将所有依赖项添加到INSTALLED_APPS中。

现在,让我举一个清晰的例子: (您可能需要阅读此处)

  • 项目A:是一个可重复使用的django app
  • 项目B& C:项目A使用的第三方django可重用应用程序(例如django-toolbar,reversion等)
  • 项目D:是你的django项目,你想在你的应用程序中包含我的项目A.

现在:

  • 您可以添加' A'在您的INSTALLED_APPS
  • 但你还必须添加' B'和' C'因为它们是' A'
  • 的依赖关系

我的问题是: 有没有办法,通过这种方式添加' A'您的项目包括' B'和' C'自动?

话虽如此,我知道如何添加自定义设置并提供合理的默认设置。仅此而已,我无法想到依赖于应用程序的问题(可能是因为它现在将成为第二天)

2 个答案:

答案 0 :(得分:1)

我在setup.py

中使用install_requires选项将其钉住

我们还有tests_require选项和extras_require指令,如果您使用的是分发,则所有指令都会转到setuptools.setup()

  • install_requiresextras_require都是需求列表(包)。
  • extras_require是一个包含'testing','doc'等的字典,是键和列表中的需求列表。

这些已添加到 0.5a4

版本的分发

相关链接:

  1. All options
  2. extras_require

答案 1 :(得分:1)

  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.pymanage.py等......但是项目A可以提供一个示例项目(沙箱或演示项目)。

  2. 项目D(Django项目):(使用app: 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.pywsgi.py等....