2013-08-07 5 views
12

У меня есть несколько приложений на основе python, состоящих из скриптов/модулей, которые должны быть упакованы и развернуты как RPM.Распространение пакета python вместе с зависимостями модулей с использованием RPM

Более сложный бит заключается в том, что каждое приложение должно быть распределено вместе со всеми зависимостями модуля python, и их следует использовать в предпочтении всем, которые установлены в системе.

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

Я рассмотрел упаковку и распространение virtualenv, но перемещение виртуального файла, похоже, не поддерживается.

Я просмотрел zc.buildout, но обнаружил, что документации не хватает. Я мог видеть, как загружать зависимости во время разработки, но не как распространять их как часть более крупного приложения. Возможно, для разных приложений требуются разные версии одного и того же модуля, поэтому их не следует устанавливать в системе.

Еще одна болевая точка заключается в том, что любые скрипты python в приложении должны быть изменены, чтобы использовать другой sys.path во время разработки и после развертывания, я не видел очевидного способа обойти это.

Есть предложения по тому, как наилучшим образом достичь этого? Идеальное резюме рабочего процесса с точки разработчика зрения будет выглядеть так:

  1. источника загрузки приложения сценария
  2. выполнения для извлечения конкретных зависимостей модулей, если нет (возможно, с помощью pip)
  3. сценарий запуска, чтобы построить python и упаковать его и все загруженные зависимости в RPM

Окончательный RPM должен быть установлен и запускаться на хосте без сетевого доступа, и установлен только интерпретатор python.

+1

Вы можете распространять автономный исполняемый файл python - упакованный в RPM? Вам нужен исходный код для пользователей? Если не смотрите здесь http://stackoverflow.com/questions/5458048/how-to-make-a-python-script-standalone-executable-to-run-without-any-dependency – Anshul

+1

Я не использовал его, но [conda's] (http://www.continuum.io/blog/conda) предназначены для обработки таких случаев, как ваши. Ознакомьтесь с разделом «Роллинг собственных пакетов» по ​​этой ссылке. –

+0

Вы должны использовать патчи с пипами или «колесные домики» – ionelmc

ответ

1

Я видел бы это как две отдельные проблемы.

  1. Вам нужна повторяющаяся система установки/сборки для ваших разработчиков.

  2. Требуется установщик установщика.

Строение (или, возможно, в сочетании с дополнительным сценарием) может позаботиться о первой проблеме. В принципе: «как подготовить проект к разработке на новом ноутбуке». В идеале вы просто скажете python bootstrap.py;bin/buildout и будьте готовы (то же самое с pip/virtualenv).

Теперь, когда у вас есть повторяемая сборка, вы можете использовать ее в качестве основы для установщика. Handiest - это чистая виртуальная машина, которую вы используете именно для этой цели. Например, Virtualbox/бродяга. Создайте сценарии, которые настроили виртуальный бокс, и установите соответствующие зависимости.

Сценарий строителя-установщика может затем выполнить новую проверку вашего проекта внутри виртуального бокса и выполнить повторную сборку в месте, где вы хотите установить его в установщике (например, /opt/yourproject).

Затем используйте FPM, чтобы сделать фактический пакет (.deb, .rpm, что угодно). Перейдите в опции FPM, которые сообщают о необходимых зависимостях, таким образом вы всегда можете быть уверены, что эти зависимости установлены. (Примечание: это зависимости от уровня ОС, такие как memcached или postgres; зависимости python следует обрабатывать с помощью pip или buildout).

Если вы разделите свою большую проблему в этих двух меньших проблемах, на них можно атаковать отдельно.

+1

Одной из проблем с FPM является то, что разные пакеты (которые вы хотите установить) могут иметь разные зависимости (например, для одного пакета требуются запросы 1.6 и другие запросы 2.1 и т. Д.), И вы не могут выражать эти различия, поскольку FPM будет упаковывать один пакет python в качестве RPM и устанавливать его (глобально, так сказать). Поэтому было бы лучше установить проект python и его зависимости как единый RPM, например [rpmvenv] (https://github.com/kevinconway/rpmvenv). – miku

Смежные вопросы