Рейтинг:0

Как установить другой оборот в зависимости от другого оборота?

флаг ng

Мы создали rpm-файл приложения, используя fpm. Там мы установили python3 в качестве зависимости, поэтому он устанавливается автоматически перед основным rpm.

Но это установка 3.7. Чтобы заменить это на 3.8, нам нужно проверить версию ОС, прежде чем это будет Centos или awslinux, и на основе этого нам нужно установить определенный rpm.

Итак, я сохранил эти условные блоки в скрипте preinst и передал в параметр --before-install.

Но он застревает во время установки rpm.

Итак, когда я проверяю подробный режим.Я обнаружил, что это не работает с preinst.

Причина в том, что ptyhon install не может применить блокировку и продолжить установку, поскольку проект уже заблокировал ее.

RPM: ошибка: невозможно создать блокировку транзакции в /var/lib/rpm/.rpm.lock (ресурс временно недоступен)
Ошибка: Не удалось запустить транзакцию.


+ echo 'Обнаружен Centos'
Centos обнаружен
+ sudo yum установить -yq python38
RPM: ошибка: невозможно создать блокировку транзакции в /var/lib/rpm/.rpm.lock (ресурс временно недоступен)
Ошибка: Не удалось запустить транзакцию.

Любые предложения, которые вы можете предоставить

Чтобы быть более конкретным, пожалуйста, найдите подробности ниже.

Инструмент, используемый для создания rpm: футов в минуту Мне нужно установить python3.8 в качестве зависимости от rpm приложения.

Если я установлю это как зависимость, используя -d python3, будет установлена ​​версия 3.7 на amazon linux и 3.6 на centos 8. Чтобы использовать версию 3.8, перед установкой пакета необходимо выполнить еще несколько шагов.

Итак, я удалил python3 из раздела зависимостей и добавил --before-install в качестве сценария оболочки.

Это сценарий оболочки, который я хранил там.

#!/бин/баш
echo "Начало подготовки"

echo "Проверка версии ОС"


DISTRO=$(cat /etc/*-release | grep -w NAME | cut -d= -f2 | tr -d '"' | tr '[:upper:]' '[:lower:]')

если [[ "$DISTRO" =~ "centos linux" ]]; тогда
  эхо "Обнаружен Centos"
  установить судо-юм -yq python38
elif [[ "$DISTRO" =~ "amazon linux" ]]; тогда
  echo "обнаружен amazon linux"
  sudo yum установить -yq amazon-linux-extras
  sudo amazon-linux-extras включить python3.8
  установить судо-юм -yq python3.8
elif [[ "$DISTRO" =~ "ubuntu" ]]; тогда
  эхо "обнаружена Ubuntu"
  sudo apt установить pyhton3 -yq
еще
  echo "Ни centos, ни amazon linux 2"
фи

Он запускает скрипт, но зависает при установке python из сценария оболочки.

RPM: ошибка: невозможно создать блокировку транзакции в /var/lib/rpm/.rpm.lock (ресурс временно недоступен)
Ошибка: Не удалось запустить транзакцию.


+ echo 'Обнаружен Centos'
Centos обнаружен
+ sudo yum установить -yq python38
RPM: ошибка: невозможно создать блокировку транзакции в /var/lib/rpm/.rpm.lock (ресурс временно недоступен)
Ошибка: Не удалось запустить транзакцию.

Любые предложения о том, как это исправить?

Мое требование - установить python3.8 как часть нашего продукта rpm, а также как зависимость.

vidarlo avatar
флаг ar
Ваша проблема в том, что rpm не может получить блокировку. У вас запущен еще один процесс `rpm`? `ps вспомогательный | grep rpm` скажет вам
флаг cn
Вы не можете создать транзакцию во время совершения транзакции (установки RPM). Просто введите «Требуется: python (abi) = 3.8», если вашему приложению требуется эта конкретная версия. Однако в вашем случае я бы пошел по пути объединения всего этого вместе, используя что-то вроде [pyinstaller](https://pyinstaller.org/en/stable/), а затем упаковал его без зависимости от Python.
Рейтинг:0
флаг cn

Установка 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 (или ЭЛ), чтобы %установить вещь. Одна хитрая вещь: для некоторых из этих дистрибутивов Python — это /usr/bin/python3, для других — /usr/bin/python38. Возможно, вы захотите сделать это переменной.

Дополнительное репозиторий Amazon python3.8 по умолчанию не включено. Включите его для сборки пакета, например, в репозиториях фиктивного инструмента. Пользователям также потребуется включить репозиторий для установки этих пакетов.

Макросы упаковки Fedora обычно генерируют соответствующие зависимости для модулей python, установленных в типичных местах, таких как %{python3_sitelib}. Я не знаю навскидку, что для этого делает amzn, возможно, то же самое. Если нет, вам может потребоваться добавить ручные операции, такие как Требуется: питон(аби) = 3.8

Создайте полученный файл спецификации для каждого интересующего уникального дистрибутива: Fedora, RHEL, Amazon Linux, CentOS Stream, SUSE. Хотя немного разные пакеты для каждого раздражают, в результате это упрощает установку yum для пользователей.

Пакеты Debian — упражнение для читателя.


Автоматические генераторы пакетов, такие как fpm, могут быть не такими умными из пакетов. Классический компромисс: быстрый генератор для поддержки нескольких дистрибутивов против упаковщика-человека, который может сделать что-то преднамеренно с особенностями нескольких дистрибутивов.

Ответить или комментировать

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