13

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

如何打包在https://docs.djangoproject.com/en/dev/intro/reusable-apps/以及许多其他网站上都很好地给出了。

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

很酷,但是我对项目有多个(第 3 方)依赖项。我是否应该在文档中告诉将所有这些包包含在 INSTALLED_APPS 列表中!

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

现在,让我举一个清晰的例子:( 您可能想从这里阅读)

  • 项目 A:是一个可重用的 django 应用程序
  • 项目 B & C:是项目 A 使用的 3rd 方 django 可重用应用程序(例如,django-toolbar、reversion 等)
  • 项目 D:是您的 django 项目,您希望将我的项目 A 包含在您的应用程序中。

现在:

  • 您可以在 INSTALLED_APPS 中添加“A”
  • 但是您还必须添加“B”和“C”,因为它们是“A”的依赖项

我的问题是: 有没有一种方法可以自动将“A”添加到您的项目中包含“B”和“C”?

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

4

2 回答 2

2

我用install_requiressetup.py 中的选项确定了它

如果您使用分发,我们还有tests_require一个选项和一个extras_require指令。setuptools.setup()

  • install_requires两者extras_require都是要求(包)列表。
  • extras_require是带有“测试”、“文档”等的字典,是键和要求列表。

这些被添加到分发版本中0.5a4

相关链接:

  1. 所有选项
  2. extras_require
于 2013-09-29T13:32:52.727 回答
2
  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等....但是项目 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, 等等....

于 2016-06-22T08:44:16.160 回答