Puncte:0

Cum se instalează un alt rpm ca dependență de un alt rpm?

drapel ng

Am construit fișierul rpm al aplicației folosind fpm. Acolo am setat python3 ca dependență, așa că se instalează automat înainte de rpm-ul principal.

Dar instalează 3.7. Pentru a-l înlocui cu 3.8, trebuie să verificăm versiunea sistemului de operare înainte dacă este centos sau awslinux și, pe baza acesteia, trebuie să instalăm un anumit rpm.

Deci, am păstrat aceste blocuri condiționate în scriptul preinst și am trecut la parametrul --before-install.

Dar, se blochează în timpul instalării rpm.

Deci, când verific cu modul verbose.Am descoperit că nu funcționează cu preinst.

Motivul, instalarea ptyhon nu poate aplica blocarea și continua instalarea, deoarece projectn a obținut deja blocarea.

RPM: eroare: nu se poate crea blocarea tranzacției pe /var/lib/rpm/.rpm.lock (Resursa indisponibilă temporar)
Eroare: Nu s-a putut executa tranzacția.


+ ecou „centos este detectat”
centos este detectat
+ sudo yum install -yq python38
RPM: eroare: nu se poate crea blocarea tranzacției pe /var/lib/rpm/.rpm.lock (Resursa indisponibilă temporar)
Eroare: Nu s-a putut executa tranzacția.

Orice sugestii pe care le puteți oferi

Pentru a fi mai specific, vă rugăm să găsiți detalii mai jos.

Instrumentul folosit pentru a crea rpm: fpm Trebuie să instalez python3.8 ca dependență de rpm-ul aplicației.

Dacă am setat asta ca dependență folosind -d python3, instalează versiunea 3.7 pe amazon linux și 3.6 pe centos 8. Pentru a utiliza versiunea 3.8, mai sunt câțiva pași care trebuie efectuati înainte de a instala pachetul.

Deci, am eliminat python3 din secțiunea de dependență și am adăugat în --before-install ca script shell.

Acesta este scriptul shell pe care l-am păstrat acolo.

#!/bin/bash
echo „Începe preinst”

echo „Verificarea versiunii sistemului de operare”


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

if [[ "$DISTRO" =~ "centos linux" ]]; atunci
  ecou "centos este detectat"
  sudo yum install -yq python38
elif [[ "$DISTRO" =~ "amazon linux" ]]; atunci
  echo „a fost detectat Amazon Linux”
  sudo yum install -yq amazon-linux-extras
  sudo amazon-linux-extras activează python 3.8
  sudo yum install -yq python3.8
elif [[ "$DISTRO" =~ "ubuntu" ]]; atunci
  ecou "ubuntu detectat"
  sudo apt install pyhton3 -yq
altfel
  echo „Nici centos, nici amazon linux 2”
fi

Declanșează scriptul, dar se blochează la instalarea python din scriptul shell.

RPM: eroare: nu se poate crea blocarea tranzacției pe /var/lib/rpm/.rpm.lock (Resursa indisponibilă temporar)
Eroare: Nu s-a putut executa tranzacția.


+ ecou „centos este detectat”
centos este detectat
+ sudo yum install -yq python38
RPM: eroare: nu se poate crea blocarea tranzacției pe /var/lib/rpm/.rpm.lock (Resursa indisponibilă temporar)
Eroare: Nu s-a putut executa tranzacția.

Ceva sugestii despre cum să remediați acest lucru?

Cerința mea este să instalez python3.8 ca parte a produsului nostru rpm și ca dependență.

vidarlo avatar
drapel ar
Problema ta este că rpm nu poate obține o blocare. Mai aveți un proces `rpm` în curs de rulare? `ps aux | grep rpm` vă va spune
drapel cn
Nu puteți crea o tranzacție în timp ce faceți o tranzacție (instalarea RPM). Pur și simplu puneți „Necesită: python(abi) = 3.8” dacă aplicația dvs. necesită acea versiune specifică. Cu toate acestea, pentru cazul dvs., aș merge pe calea de a le grupa pe toate, folosind ceva de genul [pyinstaller](https://pyinstaller.org/en/stable/), apoi aș împacheta-l fără dependență de python.
Puncte:0
drapel cn

Instalarea rpm-urilor în scripturile altui rpm nu funcționează. Deja într-o tranzacție rpm. În plus, dependențele nu sunt în metadatele pachetului și yum/dnf nu le pot rezolva. Oricare dintre acestea este o experiență slabă pentru utilizator.

Distribuții multiple într-un singur rpm sunt posibile cu utilizarea creativă a condiționalelor. Să presupunem că aveți nevoie de cel puțin Python 3.8. Împrumut de la diverse pachete rpm în CentOS şi în altă parte, build dep ar putea arăta astfel:

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

Observați chestia ciudată cu numărul prefixat cu zero. Acest lucru permite utilizarea în expresii chiar dacă variabila nu este definită.

Continuă cu Ghid de ambalare Python pentru Fedora (sau EL) pentru a %instala lucrul. Un lucru dificil: pentru unele dintre aceste distribuții Python este /usr/bin/python3 altele /usr/bin/python38. Poate doriți să faceți din asta o variabilă.

Amazon extra repo python3.8 nu este activat în mod implicit. Activați-l pentru construirea pachetului, de exemplu în repozițiile instrumentului simulat. De asemenea, utilizatorii vor trebui să activeze repo pentru a instala aceste pachete.

Macrocomenzile de ambalare Fedora vor genera de obicei dependențe adecvate pentru modulele Python instalate în locații tipice, cum ar fi %{python3_sitelib}. Nu știu ce face amzn pentru asta, probabil la fel. Dacă nu, este posibil să fie necesar să adăugați dep-uri manuale, cum ar fi Necesită: python(abi) = 3.8

Creați fișierul de specificații rezultat pe fiecare distribuție unică de interes: Fedora, RHEL, Amazon Linux, CentOS Stream, SUSE. În timp ce un pachet ușor diferit pentru fiecare este enervant, rezultă o experiență ușoară de instalare yum pentru utilizatori.

Pachetele Debian sunt un exercițiu pentru cititor.


Generatoarele automate de pachete, cum ar fi fpm, s-ar putea să nu producă pachete la fel de inteligente. Compensație clasică: generator rapid pentru a suporta mai multe distribuții, față de un pachet uman care poate face ceva intenționat cu ciudateniile mai multor distribuții.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.