【问题标题】:Packaging a django app with external dependencies使用外部依赖项打包 django 应用程序
【发布时间】:2013-09-16 23:06:50
【问题描述】:

我正在考虑将我的一个 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”?

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

【问题讨论】:

    标签: django packaging


    【解决方案1】:

    我在 setup.py 中使用 install_requires 选项确定了它

    我们还有tests_require 选项和extras_require 指令,如果您使用distribute,所有这些都转到setuptools.setup()

    • install_requiresextras_require 都是需求列表(包)。
    • extras_require 是一个包含“测试”、“文档”等的字典,是键和需求列表。

    这些被添加到 0.5a4

    版本的 distribute

    相关链接:

    1. All options
    2. extras_require

    【讨论】:

    • 这适用于只需要可导入的应用程序,但如果您的应用程序实际上需要在 INSTALLED_APPS 中列出(它们包含模型、管理类、模板标签等),那么您还需要手动添加它们。此外 - 任何自动执行此操作的方法都会有问题,因为有时 INSTALLED_APPS 的顺序很重要(例如模板覆盖或 ModelAdmin.register)
    【解决方案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.pymanage.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.pywsgi.py 等......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      • 2018-01-17
      • 1970-01-01
      • 2017-03-18
      • 2010-12-12
      • 1970-01-01
      • 2012-07-15
      相关资源
      最近更新 更多