Вопрос или проблема
У меня есть приложение, которое я упаковываю в RPM и устанавливаю на CentOS 7. Когда я устанавливаю RPM, я хочу, чтобы в него были установлены некоторые скомпилированные бинарные файлы, а также некоторые модули Python с их зависимостями.
Мои модули Python требуют более новой версии Python, чем та, что предоставляется CentOS, поэтому я буду устанавливать модули в альтернативной установке Python под /usr/local/lib/python2.7/site-packages
. Это означает, что я не могу использовать RPM, предоставленные CentOS, так как они устанавливаются под /usr/lib
. Я могу легко установить модули под /usr/local/lib
с помощью pip
.
Существует ли способ упаковать мое приложение так, чтобы:
- Я мог установить свое приложение из RPM.
- Мои модули Python устанавливались под
/usr/local/lib
при установке приложения. - Все зависимости Python также устанавливались.
- Я избегал 유지 관리 RPM-пакетов для зависимостей Python.
Существует ли какая-либо конвенция для этого типа задач? Или, возможно, есть какие-то примеры? Я не нашел ничего прямосвязанного в документации по упаковке Python в Fedora.
Опции, которые я рассматривал, следующие:
-
Упаковать мое приложение, модули Python и все зависимости Python в один RPM.
Мне не нравится этот вариант, потому что я не смогу обновить отдельные зависимости на клиентской системе, не обновляя все свое приложение до новой версии.
-
Создать отдельные RPM для моего приложения, моих модулей Python и сторонних зависимостей.
Мне не нравится этот вариант, потому что мне придется поддерживать RPM для каждого отдельного стороннего модуля в моем дереве зависимостей.
-
Вызвать
pip
изнутри моего RPM.Мне не нравится этот вариант, потому что RPM не сможет отслеживать изменения, которые делает
pip
, и я не смогу определить, можно ли безопасно удалить сторонние модули Python при удалении RPM.
Используя программные коллекции, вы можете иметь новые версии модулей на старой системе или старые модули на новой системе. См.: http://www.softwarecollection.org/
Ответ или решение
Чтобы установить зависимости модулей Python из вашего RPM-пакета на CentOS 7, следует учесть несколько важных моментов, учитывая, что вы планируете использовать Python altinstall в каталоге /usr/local/lib/python2.7/site-packages
. Ниже приведены шаги и рекомендации, которые помогут вам эффективно справиться с этой задачей, избегая необходимости в обслуживании множества отдельных RPM-пакетов для зависимостей.
Шаг 1: Использование Software Collections (SCL)
Первый шаг заключается в рассмотрении возможности использования Software Collections (SCL). SCL позволяет устанавливать более новые версии программного обеспечения рядом с уже установленными версиями. Вы можете установить нужную версию Python через SCL, а также управлять зависимостями.
-
Установите SCL на вашей системе:
sudo yum install centos-release-scl sudo yum install rh-python36 # Устанавливаем Python 3.6, например
-
После установки активируйте окружение SCL:
scl enable rh-python36 bash
Это позволит использовать новую версию Python и pip для установки ваших модулей, а также облегчит управление зависимостями.
Шаг 2: Упаковка вашего приложения и зависимостей
Для упрощения процесса установки, вы можете создать RPM-пакет, который будет включать ваше приложение и зависимости, но без лишней нагрузки в виде управления множеством отдельных RPM. Вот несколько методов, которые можно использовать:
-
Bundling (Упаковка вместе):
- Упакуйте ваше приложение вместе с необходимыми модулями и их зависимостями в один RPM. Однако, как вы уже отмечали, это усложняет обновление отдельных модулей. Чтобы минимизировать это, постарайтесь использовать фиксированные версии модулей, если это возможно.
-
Включение зависимостей через pip и virtualenv:
- Создайте
requirements.txt
, который будет содержать все зависимости вашего приложения. Затем напишите скрипт, который будет вызываться во время установки RPM и будет использовать pip для установки модулей в нужный каталог. Например:
%post pip install --target=/usr/local/lib/python2.7/site-packages -r /path/to/your/requirements.txt
Однако, как вы упомянули, это может привести к проблемам с отслеживанием зависимостей RPM, поэтому стоит тщательно документировать, какие модули устанавливаются.
- Создайте
Шаг 3: Поддержка и Управление Зависимостями
Чтобы избежать проблем с управлением зависимостями, рекомендуется следующее:
-
Используйте отдельные виртуальные окружения (virtual environments). Это позволит изолировать зависимости вашего приложения от системных библиотек.
-
Документация. Включите в RPM полную документацию о том, какие зависимости установлены, чтобы другие разработчики могли понимать, как управлять этими модулями в будущем.
-
Используйте
rpmbuild
для создания вашего RPM. Vy можете указать в описании пакетных файлов зависимости в разделе «Requires», так чтобы RPM знал, какие дополнительные модули могут потребоваться в будущем.
Заключение
В заключение, эффективно установить зависимости Python из RPM на CentOS 7 можно, используя Software Collections и подход, основанный на упаковке вашего приложения вместе с его модулями. При этом важно правильно документировать все зависимости и поддерживать их с помощью виртуальных окружений. Таким образом вы сможете избежать избыточной нагрузки, связанной с управлением отдельными RPM и зависимостями.
Это предложение не только упрощает установку, но и обеспечивает гибкость для последующего обновления.