Дмитрий Федосеев. Практика использования setuptools
В своём докладе я расскажу как использовать пакет setuptools для подготовки ПО к распространению, использованию утилит easy_install и pip, приведу удачные примеры оформления ПО в виде пакетов.
PEP 440 -- Version Identification and Dependency Specification. 3. Используется для определения необходимости обновления. 4. Используется для решения конфликтов версий.
список устанавливаемых пакетов - вложенные пакеты не включаются автоматически. 3. Функция find_packages() помогает рекурсивно просматривать папки и искать в них пакеты. 4. Если код расположен в src/ - указать это в вызове find_packages(‘src’) и добавить к вызову setup аргумент package_dir:
установке пакета создать скрипты-обертки, вызывающие указанные функции модулей. 3. Скрипты создаются в папке $HOME/.local/bin (или /usr/local/bin) - их можно вызывать по короткому имени, так как они попадают в $PATH.
пакетов. 2. Может ссылаться на внешние источники пакетов - указывается при создании окружения, но нет возможности выбора включаемых пакетов. 3. Вручную можно создать симлинки на пакеты из внешних источников. 4. При установке пакетов с бинарными зависимостями требуются средства для компиляции. 5. Решает конфликты версий пакетов в среде разработки. Использование в продуктивной среде избыточно - конфликт версий пакетов в рамках одной информационной системы является недопустимым дефектом проектирования системы.
больший приоритет, чем установленные в /usr 2. Не требуется повышение привилегий доступа к файловой системе, установка выполняется пользователем. 3. При использовании easy_install и pip старых версий требуется указать ключ --user. 4. При использовании easy_install пакет не будет установлен, если подходящая версия уже установлена в системные папки. 5. При использовании pip пакет будет установлен, независимо от его наличия в системных папках. 6. Доступны только установившему их пользователю.
каждой информ. системы. 2. virtualenv - лишний компонент. 3. Установить пакеты с бинарными зависимостями из репозитория ОС. 4. Подготовить пакет с указанием зависимостей в setup.py; пакеты п.3 исключить из setup.py (но не забывать). 5. Установить в домашнюю папку подготовленный пакет.
Проблема: приложения попадают в общее пространство имен и засоряют его. 3. Решение: namespace packages 4. Проблема: настройки приложений и проекта хранятся в общем репозитории - это небезопасно и неудобно при многократном развертывании. 5. Решение: разделить конфигурационные файлы и код.
пространстве имен. 2. Приложения разрабатываются и упаковываются независимо, но это не создает конфликта имен. 3. Пакет верхнего уровня всех приложений должен содержать единственный файл __init__.py с единственной строкой: __import__('pkg_resources').declare_namespace(__name__)
используется шаблон: django-admin startproject --template <template_dir> <project> 2. Шаблон по умолчанию находится в django/conf/project_template/ 3. Попробуйте другой шаблон - https://bitbucket.org/dmitryfedoseev/django-project-template 4. Поместите код во внешнее хранилище - git commit, git push.