Как распространять приложение Python / Django через RPM - PullRequest
7 голосов
/ 12 июля 2010

Я перечитал этот вопрос , и я думаю, что это хорошее начало, но мне нужно больше понимания.

Я написал приложение, используя Python 2.6 и Django 1.2.1. Я хотел бы развернуть это приложение в системе, в которой не установлен Python 2.6 или Django. В самой системе не установлено много вещей - sqlite3, pysqlite2, gcc и т. Д. Однако в системе есть Python 2.4.3.

Каков самый разумный способ создания RPM-версий Python 2.6, Django и самого моего приложения (стандартное приложение Django), чтобы каждое из них можно было установить отдельно для обновления различных компонентов?

Я не знаю много о создании исходных RPM, но я подозреваю, что эта информация легко доступна. Если есть какие-то особенно полезные ресурсы для создания исходных RPM, я бы их тоже оценил.

Система ESX 4 Update 1, если это имеет значение.

Спасибо!

UPDATE: Мне также никогда не приходило в голову, что распространение яиц Python или даже использование setup.py является жизнеспособным решением для распространения контента. Мне было бы интересно услышать об этом тоже.

Ответы [ 5 ]

5 голосов
/ 14 июля 2010

Помимо всех проблем normal , возникающих при упаковке кода Python, проекты Django имеют несколько других проблем, которые необходимо решить:

  • Хорошая игра с системными путями
  • Хорошая игра с системными возможностями
  • Обработка переводов
  • Рандомизация секретного ключа

Мне пришлось решить эти проблемы для упаковки Transifex , и я рекомендую вам изучить различные биты, которые были установлены, чтобы заставить его работать:

  • Установить под /usr/share/<projectname>
  • Используйте execfile() для загрузки настроек из /etc/<projectname>
  • Огромный откат для обработки перевода
  • Замена секретного ключа в постустановочном скрипте
  • Все остальные кровавые изменения и выдумки, которые требовались
3 голосов
/ 07 мая 2012

См. главу 5 документации Python . Он покажет, как работать с утилитой bdist Python. С его помощью вы сможете создавать пакеты (или, как говорится, «встроенный дистрибутив») нескольких типов, включая RPM.

3 голосов
/ 19 июля 2010

Пакеты Python обычно распространяются с setuptools / distribate . Как правило, вы можете установить каждый пакет Python (и его зависимости) с easy_install <package_name> (опционально с конкретным номером версии). Я бы порекомендовал вам использовать setuptools в качестве основного метода распространения, потому что:

  • работает на всех платформах
  • является предпочтительным способом для пакетов Python в целом
  • .rpm или .deb установочные скрипты также могут повторно использовать его части
  • вы можете установить эти пакеты внутри virtualenv без необходимости получения привилегий root, не конфликтуя с остальными установленными веб-приложениями на сервере

Хороший ресурс для чтения: Развертывание с помощью Distribute . Он фокусируется на Flask (еще один веб-фреймворк), но простая замена «Flask» на «Django» сделает свое дело:)

Еще одним инструментом Python, который отлично подходит для распространения и развертывания, является fabric , который вы можете использовать в дополнение к распространению (или без него, как вы хотите). С помощью Fabric вы можете, например, загрузить и установить приложение (включая зависимости) сразу на N серверов, управлять несколькими серверами разработки, тестирования и производства и обновлять их одновременно с помощью одной команды.

Эта статья может помочь вам начать работу с Fabric: Развертывание с Fabric

И, кроме того, я бы порекомендовал вам опубликовать свой репозиторий (или скопировать существующий) на github или bitbucket для людей, которые хотят получить последние исходные коды вручную и установить ваши приложение с python setup.py install впоследствии. Сценарий установки setup.py является частью дистрибутива, о котором я упоминал ранее.

2 голосов
/ 18 мая 2016

Я написал сообщение в блоге о том, как использовать setuptools, и это команда bdist_rpm , чтобы создать rpm для вас.Так что, действительно, используйте setuptools, но на самом деле распространяйте ваше приложение как rpm.Есть несколько ловушек и странных недокументированных вещей в setuptools, которые вы можете использовать, чтобы в итоге получить хороший рабочий процесс.

Ключ в том, что вам нужен сценарий после установки, который запускает ваши миграции и собирает ваши статические файлы, которыезапустить после установки rpm

export DJANGO_SETTINGS_MODULE=accountpage.settings
mkdir -p /var/www/django/static && chown apache:apache /var/www/django/static
runuser -m apache -c 'echo "yes" | django-admin collectstatic'
django-admin migrate
service httpd restart

, и вы можете указать setuptools добавить его в файл спецификации перед тем, как он создаст rpm, задав эту опцию в вызове установки:

options = {'bdist_rpm':{'post_install' : 'bdist_rpm_post_install.sh'}},

См. Ссылку выше для полного рабочего скрипта setup.py, хука после установки и комплекта тестов, который работает с python setup.py test, который установит все ваши зависимости локально и запустит тесты django.

Чтобы rpm также автоматически устанавливал свои зависимости, создайте файл setup.cfg, который сообщает bdist_rpm о его зависимостях

[bdist_rpm]
requires = python >= 2.7
           django >= 1.8
           httpd
           Django-Select2 >= 4.3.1
           django-easy-select2
           django-model-utils
           pytz
           django-oauth-toolkit
2 голосов
/ 14 июля 2010

Уже доступны RPM python 2.6 и django - так что, по крайней мере, их (относительно) легко захватить и установить через RPM.Для создания RPM для вашего проекта есть описание некоторых деталей с использованием Distutils , в котором подробно описывается, что вам нужно в файле спецификации и что вы вызываете, чтобы это произошло.

Также есть примечание о создании RPM из python в StackOverflow по адресу Создание Python RPM , в котором также присутствуют некоторые детали.

Из опыта, упаковка самого Python в RPMэто самый хитрый из тварей, поэтому я бы порекомендовал воспользоваться тем, что уже есть.Для нескольких программ, где я видел это, у нас есть Makefile (да, старая школа), который запускает команду setup.py bdist_rpm на сервере непрерывной интеграции, делая RPM доступным в результате этой сборки и немедленно доступным наCI сервер.

...