Мы создали файл rpm приложения с помощью fpm. Там мы установили python3 как зависимость, поэтому он устанавливается автоматически перед основным rpm.
Но он устанавливает 3.7. Чтобы заменить его на 3.8, нам нужно сначала проверить версию ОС, centos это или awslinux, и на основе этого нам нужно установить определенный rpm.
Поэтому я сохранил эти условные блоки в скрипте preinst и передал параметру --before-install.
Но он зависает во время установки RPM.
Итак, когда я проверяю в режиме verbose, я обнаружил, что он не работает с preinst.
Причина в том, что ptyhon install не может применить блокировку и продолжить установку, так как projectn уже заблокировал ее.
RPM: error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Resource temporarily unavailable)
Error: Could not run transaction.
+ echo 'centos is detected'
centos is detected
+ sudo yum install -yq python38
RPM: error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Resource temporarily unavailable)
Error: Could not run transaction.
Какие предложения вы можете предоставить?
Более конкретную информацию можно найти ниже.
Инструмент, используемый для создания rpm:fpm Мне нужно установить python3.8 как зависимость для нашего приложения rpm.
Если я установлю это как зависимость с помощью -d python3, то будет установлена версия 3.7 на amazon linux и 3.6 на centos 8. Чтобы использовать версию 3.8, перед установкой пакета необходимо выполнить еще несколько шагов.
Поэтому я удалил python3 из раздела зависимостей и добавил --before-install как скрипт оболочки.
Это скрипт оболочки, который я там сохранил.
#!/bin/bash
echo "Starting preinst"
echo "Checking OS Version"
DISTRO=$(cat /etc/*-release | grep -w NAME | cut -d= -f2 | tr -d '"' | tr '[:upper:]' '[:lower:]')
if [[ "$DISTRO" =~ "centos linux" ]]; then
echo "centos is detected"
sudo yum install -yq python38
elif [[ "$DISTRO" =~ "amazon linux" ]]; then
echo "amazon linux detected"
sudo yum install -yq amazon-linux-extras
sudo amazon-linux-extras enable python3.8
sudo yum install -yq python3.8
elif [[ "$DISTRO" =~ "ubuntu" ]]; then
echo "ubuntu detected"
sudo apt install pyhton3 -yq
else
echo "Neither centos nor amazon linux 2"
fi
Скрипт запускается, но останавливается на установке Python из скрипта оболочки.
RPM: error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Resource temporarily unavailable)
Error: Could not run transaction.
+ echo 'centos is detected'
centos is detected
+ sudo yum install -yq python38
RPM: error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Resource temporarily unavailable)
Error: Could not run transaction.
Есть ли какие-нибудь предложения, как это исправить?
Мне необходимо установить python3.8 как часть нашего продукта RPM, а также как зависимость.
решение1
Установка rpm в скрипты других rpm не работает. Уже в транзакции rpm. Кроме того, зависимости отсутствуют в метаданных пакета, и yum/dnf не может их разрешить. Любой из этих вариантов — плохой пользовательский опыт.
Несколько дистрибутивов в одной спецификации rpm возможны при творческом использовании условных операторов. Допустим, вам требуется как минимум Python 3.8. Заимствование из различных пакетов rpmв CentOS и в других местах, сборка dep может выглядеть так:
%if 0%{?fedora} || 0%{?rhel} > 8
BuildRequires: python3-devel
%endif
%if 0%{?amzn} || 0%{?rhel} == 8 || 0%{?suse_version} > 1500
BuildRequires: python38-devel
%endif
Обратите внимание на странную вещь с префиксом нуль. Это позволяет использовать в выражениях, даже если переменная не определена.
Продолжить сРуководство по упаковке Python для Fedora(или ЭЛ) для %install этой штуки. Одна хитрость: для некоторых из этих дистрибутивов Python - это /usr/bin/python3, для других - /usr/bin/python38. Возможно, стоит сделать это переменной.
Amazon extra repo python3.8 по умолчанию не включен. Включите его для сборки пакета, например, в репозиториях mock tool. Пользователям также потребуется включить репозиторий для установки этих пакетов.
Макросы упаковки Fedora обычно генерируют соответствующие зависимости для модулей python, установленных в типичных местах, таких как %{python3_sitelib}. Я не знаю навскидку, что amzn делает для этого, вероятно, то же самое. Если нет, вам может потребоваться добавить ручные зависимости, напримерRequires: python(abi) = 3.8
Создайте полученный файл спецификации для каждого интересующего вас уникального дистрибутива: Fedora, RHEL, Amazon Linux, CentOS Stream, SUSE. Хотя немного отличающийся пакет для каждого раздражает, в результате получается простой опыт установки yum для пользователей.
Пакеты Debian — это упражнение для читателя.
Автоматические генераторы пакетов, такие как fpm, могут не выдавать такие умные пакеты. Классический компромисс: быстрый генератор для поддержки нескольких дистрибутивов против человека-упаковщика, который может сделать что-то намеренное с причудами нескольких дистрибутивов.