Como instalar outro rpm como dependência de outro rpm?

Como instalar outro rpm como dependência de outro rpm?

Construímos o arquivo rpm do aplicativo usando fpm. Lá definimos python3 como dependência, para que ele seja instalado automaticamente antes do rpm principal.

Mas está instalando 3.7. Para substituir pelo 3.8, precisamos verificar a versão do sistema operacional antes se é centos ou awslinux e com base nisso precisamos instalar rpm específico.

Então, mantive esses blocos condicionais no script preinst e passei para o parâmetro --before-install.

Mas ele está travando durante a instalação do rpm.

Então, quando verifico com o modo detalhado. Descobri que não está funcionando com preinst.

O motivo é que o ptyhon install não consegue aplicar o bloqueio e continuar a instalação, pois o projeto já adquiriu o bloqueio.

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.

Qualquer sugestão que você possa fornecer

Para ser mais específico, encontre detalhes abaixo.

A ferramenta usada para criar rpm:pm Preciso instalar o python3.8 como dependência do rpm do aplicativo.

Se eu definir isso como dependência usando -d python3, ele estará instalando a versão 3.7 no amazon linux e 3.6 no centos 8. Para usar a versão 3.8, há algumas outras etapas a serem executadas antes de instalar o pacote.

Então, removi o python3 da seção de dependência e adicionei --before-install como script de shell.

Este é o script de shell que mantive lá.

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

Ele está acionando o script, mas travando na instalação do python a partir do 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.

Alguma sugestão sobre como consertar isto?

Meu requisito é instalar o python3.8 como parte do rpm do nosso produto e também como uma dependência.

Responder1

Instalar rpms em scripts de outro rpm não funciona. Já em uma transação rpm. Além disso, as dependências não estão nos metadados do pacote e yum/dnf não pode resolvê-las. Qualquer um deles representa uma experiência ruim para o usuário.

Várias distros em uma especificação de rpm são possíveis com o uso criativo de condicionais. Digamos que você precise de pelo menos Python 3.8. Emprestando de vários pacotes rpmno CentOS e em outro lugar, o build dep pode ser parecido com:

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

Observe a estranha coisa do número prefixado zero. Isto permite o uso em expressões mesmo que a variável não esteja definida.

Continue comDiretrizes de empacotamento Python para Fedora(ou E.L.) para% instalar a coisa. Uma coisa complicada: para algumas dessas distros, Python é /usr/bin/python3, outras /usr/bin/python38. Pode desejar tornar isso uma variável.

O repositório extra da Amazon python3.8 não está habilitado por padrão. Habilite-o para a construção do pacote, por exemplo, nos repositórios da ferramenta simulada. Os usuários também precisarão habilitar o repositório para instalar esses pacotes.

As macros de empacotamento do Fedora geralmente geram dependências apropriadas para módulos python instalados em locais típicos como %{python3_sitelib} Não sei de imediato o que o amzn faz para isso, provavelmente o mesmo. Caso contrário, pode ser necessário adicionar dependências manuais, comoRequires: python(abi) = 3.8

Crie o arquivo de especificações resultante em cada distribuição exclusiva de interesse: Fedora, RHEL, Amazon Linux, CentOS Stream, SUSE. Embora um pacote ligeiramente diferente para cada um seja irritante, o resultado é uma experiência de instalação fácil para os usuários.

Os pacotes Debian são um exercício para o leitor.


Geradores automáticos de pacotes como fpm podem não produzir pacotes tão inteligentes. Troca clássica: gerador rápido para suportar múltiplas distros, versus um empacotador humano que pode fazer algo intencional com as peculiaridades das diversas distribuições.

informação relacionada