14.03

Распространение django приложений

В джанге есть стандартные команды для создания проекта и приложения. По-умолчанию приложение создается внутри проекта, т.е. является его частью. Если необходимо повторно использовать данное приложение в другом проекте, логично, что оно будет просто туда скопировано. Через какое-то время может получиться так, что у нас есть несколько версий одного приложения с сопоставимым фукционалом, которые могу развиваться параллельно. Таким образом, в какой-то момент времени при включении данного приложения в новый проект сталкиваемся с выбором какую версию всетаки необходимо использовать.

В понятиях языка Python django-приложение является пакетом и следовательно должно распространятся как пакет. При публикации приложений в открытых репозиториях об этом обычно почему-то забывают. Для django-проекта отличие только в том, что приложение будет находится не непосредственно в проекте, а скорее всего в папке "site-packages" интерпритатора python, т.е. установлено непосредственно в систему или в виртуальное окружение (virtualenv).

Для распространения пакетов используют Setuptools и Distutils.

Дистрибутив пакета - это .zip или .tar.gz архив, содержащий как минимум исходный код или откомпилированные модули пакета, файлы README и setup.py. Название дистрибутива содержит имя пакета и его версию.

Скрипт setup.py нужен для:

  • предоставления информации о пакете - версия пакета, описание, домашняя страница, автор, e-mail автора, ключевые слова и т.п.;
  • управления процессом установки (в нем указывается список библиотек необходимых для установки и их расположение в пакете; файлы, не являющиеся программными модулями, которые необходимо копировать в систему вместе с библиотеками модуля; если пакет сожержит консольные скрипты, то возможна их установка в систему).

Пример содержимого файла setup.py:

from setuptools import setup, find_packages

version = __import__('typograph').get_version()
def read(fname):
    return open(os.path.join(os.path.dirname(__file__), fname)).read()
setup(
    name="typograph",
    version=version,
    description="Typography application for django based projects",    license = "BSD",
    long_description=read('README'),
    keywords="django typography tinymce",
    author="Alex Kamedov",
    author_email="alex@kamedov.ru",
    url="http://github.com/alekam/django-typograph.git",
    platforms=["any"],
    classifiers=["Development Status :: 3 - Alpha",
                   "Environment :: Web Environment",
                   "Framework :: Django",
                   "Intended Audience :: Developers",
                   "Operating System :: OS Independent",
                   "Programming Language :: Python",
                   "Topic :: Utilities"],
    packages=find_packages(),
    include_package_data=True,
    zip_safe=False,
)

Подробней можно посмотреть Installing Python Modules, cписок классификаторовWriting the Setup Script.

Таким образом, пример файловой структуры django-приложения будет таким:

django-my-app/
             /my_app/
                    /models.py
                    /views.py
                    /tests.py
                    / ...
             /README
             /setup.py

Дистрибутив приложения можно создать с помощью setup.py:

python setup.py sdist   # дистрибутив, содержащий исходные коды пакета
python setup.py bdist   # сборка бинарного дистрибутива
python setup.py bdist_rpm   # сборка rpm-пакета
python setup.py bdist_wininst # сборка пакета установки под MS Windows

Стандартный способ установки пакетов:

python setup.py install

Доступные в интернете дистрибутивы приложений можно установить с помощью утилиты easy_install, которая входит в состав Setuptools. Ей можно передать URL-адрес пакета либо его название и URL-адреса ресурсов, на которых необходимо провести поиск пакета. Если указано только название пакета, то его поиск будет произведен только в Python Package Index (PyPI, Cheese Chop).

PyPI - это репозиторий доступных дополнительных библиотек расширений для языка Python. Если там зарегистрироваться, то можно будет загружать свои библиотеки:

python setup.py upload

Таким образом, в языке программирования python есть стандартные библиотеки обеспечивающие инфраструктуру для распространения дополнительных библиотек расширяющих возможности языка.

Если вы не хотите, чтобы ваш код стал достоянием общественности, то гореть вам в аду для упрощения развертывания новых проектов логично поднять свой аналог PyPI. Тем более что в этом нет ничего сложного. Достаточно выложить дистрибутивы пакетов к себе на сайт и обычного индексного файла, созданного например веб-сервером Apache будет достаточно.

Развертывание библиотек из подобных репозиториев легко автоматизируется, но об этом поговорим в другой раз. Другое приемущество - явное указание зависимостей и их автоматическое разрешение при установке пакета. Подробности на сайте PEAK - Python Enterprise Application Kit:

Еще можно посмотреть статью Джеймса Беннета On packaging.
Раздел: Django Тэги: easy_install, PyPI, python, setup.py

Коментарии

#105.08.2013, 13:52 Лев пишет:

То есть получается я пишу приложение на одной машине, туда же ставлю с помощью setup.py необходимые пакеты. Но если я хочу перенести это все на другую машину? Там также надо заново эти все пакеты переустанавливать?

Оставьте комментарий

© 2010 Алексей Камедов

При копировании материалов блога ссылка на источник обязательна.