Wie installiere ich ein anderes RPM als Abhängigkeit zu einem anderen RPM?

Wie installiere ich ein anderes RPM als Abhängigkeit zu einem anderen RPM?

Wir haben die RPM-Anwendungsdatei mithilfe von fpm erstellt. Dort haben wir python3 als Abhängigkeit festgelegt, sodass es automatisch vor dem Haupt-RPM installiert wird.

Aber es wird 3.7 installiert. Um das durch 3.8 zu ersetzen, müssen wir vorher die Betriebssystemversion prüfen, ob es CentOS oder AWSLinux ist, und basierend darauf müssen wir ein bestimmtes RPM installieren.

Daher habe ich diese bedingten Blöcke im Preinst-Skript beibehalten und an den Parameter --before-install übergeben.

Aber es bleibt während der RPM-Installation hängen.

Als ich also den ausführlichen Modus überprüfte, stellte ich fest, dass es mit Preinst nicht funktionierte.

Der Grund dafür ist, dass Python nicht in der Lage ist, die Sperre anzuwenden und die Installation fortzusetzen, da Projectn bereits eine Sperre dafür erhalten hat.

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.

Alle Vorschläge, die Sie machen können

Genauere Einzelheiten finden Sie weiter unten.

Das zum Erstellen von RPM verwendete Tool:fpm Ich muss Python 3.8 als Abhängigkeit zu unserem Anwendungs-RPM installieren.

Wenn ich das mit -d python3 als Abhängigkeit festlege, wird Version 3.7 unter Amazon Linux und 3.6 unter CentOS 8 installiert. Um Version 3.8 zu verwenden, müssen vor der Installation des Pakets noch einige weitere Schritte ausgeführt werden.

Also habe ich Python3 aus dem Abhängigkeitsabschnitt entfernt und --before-install als Shell-Skript hinzugefügt.

Dies ist das Shell-Skript, das ich dort aufbewahrt habe.

#!/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

Es löst das Skript aus, bleibt aber bei der Python-Installation vom Shell-Skript hängen.

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.

Irgendwelche Vorschläge, wie man das Problem beheben kann?

Meine Anforderung besteht darin, Python 3.8 als Teil unseres Produkt-RPM und auch als Abhängigkeit zu installieren.

Antwort1

Das Installieren von RPMs in den Skripten eines anderen RPMs funktioniert nicht. Befindet sich bereits in einer RPM-Transaktion. Außerdem befinden sich die Abhängigkeiten nicht in den Paketmetadaten und Yum/DNF kann sie nicht auflösen. Beides ist eine schlechte Benutzererfahrung.

Mehrere Distributionen in einer RPM-Spezifikation sind durch den kreativen Einsatz von Bedingungen möglich. Angenommen, Sie benötigen mindestens Python 3.8. Ausleihen aus verschiedenen RPM-Paketenin CentOS und anderswo, Build Dep könnte folgendermaßen aussehen:

%if 0%{?fedora} || 0%{?rhel} > 8 
BuildRequires: python3-devel
%endif
%if 0%{?amzn} || 0%{?rhel} == 8 || 0%{?suse_version} > 1500
BuildRequires: python38-devel
%endif

Beachten Sie die seltsame Sache mit der Null als vorangestellter Zahl. Dies ermöglicht die Verwendung in Ausdrücken, auch wenn die Variable nicht definiert ist.

Weitermachen mitPython-Paketierungsrichtlinien für Fedora(oder EL), um das Ding %installieren zu können. Eine knifflige Sache: Bei einigen dieser Distributionen ist Python /usr/bin/python3, bei anderen /usr/bin/python38. Vielleicht möchten Sie daraus eine Variable machen.

Amazon Extra Repo Python3.8 ist standardmäßig nicht aktiviert. Aktivieren Sie es für den Paketerstellungsvorgang, beispielsweise in den Repos des Mock-Tools. Benutzer müssen das Repo auch aktivieren, um diese Pakete zu installieren.

Fedora-Verpackungsmakros generieren normalerweise entsprechende Abhängigkeiten für Python-Module, die an typischen Orten wie %{python3_sitelib} installiert sind. Ich weiß nicht spontan, was amzn dafür tut, wahrscheinlich dasselbe. Wenn nicht, müssen Sie möglicherweise manuelle Abhängigkeiten hinzufügen, wie z. B.Requires: python(abi) = 3.8

Erstellen Sie die resultierende Spezifikationsdatei für jede einzelne Distribution, die Sie interessiert: Fedora, RHEL, Amazon Linux, CentOS Stream, SUSE. Obwohl es ärgerlich ist, dass für jede Distribution ein leicht unterschiedliches Paket zur Verfügung steht, ist dies für Benutzer eine einfache Yum-Installation.

Debian-Pakete sind eine Übung für den Leser.


Automatische Paketgeneratoren wie fpm geben möglicherweise keine so intelligenten Pakete aus. Klassischer Kompromiss: schneller Generator zur Unterstützung mehrerer Distributionen versus menschlicher Paketierer, der mit den Eigenheiten der verschiedenen Distributionen gezielt etwas anfangen kann.

verwandte Informationen