Ons het toepassing rpm lêer gebou met behulp van fpm. Daar het ons python3 as afhanklikheid gestel, so dit installeer outomaties voor die hoof rpm.

Maar dit installeer 3.7. Om dit met 3.8 te vervang, moet ons die OS-weergawe vooraf nagaan of dit centos of awslinux is en op grond daarvan moet ons spesifieke rpm installeer.

So, ek het hierdie voorwaardelike blokke in die preinst script gehou en na parameter --before-install deurgegee.

Maar dit sit vas tydens rpm-installasie.

Dus, wanneer ek met verbose modus kyk. Ek het gevind dat dit nie met preinst werk nie.

Die rede, dit is dat ptyhon install nie in staat is om slot toe te pas en die installasie voort te sit nie, aangesien projek reeds slot daarop verkry het.

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.

Enige voorstelle wat jy kan verskaf

Om meer spesifiek te wees, vind asseblief besonderhede hieronder.

Die instrument wat gebruik word vir die skep van rpm: fpm Ek moet python3.8 installeer as afhanklikheid van die toepassing rpm.

As ek dit as afhanklikheid stel deur -d python3 te gebruik, installeer dit 3.7 weergawe op Amazon Linux en 3.6 op centos 8. Om 3.8 weergawe te gebruik, is daar min ander stappe wat uitgevoer moet word voordat die pakket geïnstalleer word.

Dus, ek het die python3 uit die afhanklikheidsafdeling verwyder en in --before-install as shell script bygevoeg.

Dit is die dopskrif wat ek daar gehou het.

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

Dit aktiveer die script, maar sit vas by die python-installasie vanaf shell script.

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.

Enige voorstelle oor hoe om dit reg te stel?

My vereiste is om python3.8 te installeer as deel van ons produk rpm ook as 'n afhanklikheid.

answer

Die installering van rpm's in 'n ander rpm se skrifte werk nie. Reeds in 'n rpm-transaksie. Verder is die afhanklikhede nie in die pakketmetadata nie, en yum/dnf kan dit nie oplos nie. Een van hierdie is 'n swak gebruikerservaring.

Veelvuldige distros in een rpm-spesifikasie is moontlik met kreatiewe gebruik van voorwaardes. Sê jy het ten minste Python 3.8 benodig. Leen van verskeie rpm-pakkette in CentOS en elders , kan bou-dep soos volg lyk:

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

Let op die vreemde nul-voorvoegsel-ding. Dit maak voorsiening vir gebruik in uitdrukkings, selfs al is die veranderlike nie gedefinieer nie.

Gaan voort met Python-verpakkingsriglyne vir Fedora ( of EL ) om die ding te %installeer. Een moeilike ding: vir sommige van hierdie distros is Python /usr/bin/python3 ander /usr/bin/python38. Wil dalk dit 'n veranderlike maak.

Amazon ekstra repo python3.8 is nie by verstek geaktiveer nie. Aktiveer dit vir die pakketbou, byvoorbeeld in die repos van die skyngereedskap. Gebruikers sal ook die repo moet aktiveer om hierdie pakkette te installeer.

Fedora-verpakkingsmakro's sal gewoonlik toepaslike afhanklikhede genereer vir python-modules wat op tipiese liggings geïnstalleer is soos %{python3_sitelib} Ek weet nie dadelik wat amzn hiervoor doen nie, waarskynlik dieselfde. Indien nie, sal jy dalk handmatige deps moet byvoeg, soosRequires: python(abi) = 3.8

Bou die gevolglike spesifikasielêer op elke unieke verspreiding van belang: Fedora, RHEL, Amazon Linux, CentOS Stream, SUSE. Alhoewel 'n effens verskillende pakket vir elkeen irriterend is, is dit 'n maklike yum-installasie-ervaring vir gebruikers.

Debian-pakkette is 'n oefening vir die leser.


Outomatiese pakketopwekkers soos fpm lewer dalk nie so slim van pakkette uit nie. Klassieke afwyking: vinnige kragopwekker om veelvuldige distros te ondersteun, teenoor 'n menslike verpakker wat iets opsetlik kan doen met die eienaardighede van die verskeie verspreidings.