[Fixed]-Packaging a django app with external dependencies

2👍

I nailed it with install_requires option in setup.py

We also have tests_require option and an extras_require directive which all goes to setuptools.setup() if you are using distribute.

  • install_requires and extras_require both are a list of requirements (packages).
  • extras_require is a dictionary with ‘testing’, ‘doc’ etc., are keys and a list of requirements as list.

These are added into distribute in version 0.5a4

Relevant links:

  1. All
    options
  2. extras_require

2👍

  1. Project A: (with internal app: c and external apps: 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
    

    Project A may be designed as a framework/library without implementation. Thus it does not have wsgi.py, manage.py, etc…. But Project A could provide an example project (sandbox or demo project).

  2. Project D (Django Project): (with 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()
    

    Project D is an implementation of Project A. Thus it may contains settings.py, wsgi.py, etc….

👤Yeo

Leave a comment