¿Cómo instalar otro rpm como dependencia de otro rpm?

¿Cómo instalar otro rpm como dependencia de otro rpm?

Hemos creado un archivo rpm de aplicación usando fpm. Allí configuramos python3 como dependencia, por lo que se instala automáticamente antes del rpm principal.

Pero está instalando 3.7. Para reemplazar eso con 3.8, debemos verificar la versión del sistema operativo antes, si es centos o awslinux y, en función de eso, debemos instalar rpm específicas.

Entonces, mantuve estos bloques condicionales en el script preinst y los pasé al parámetro --before-install.

Pero se atasca durante la instalación de rpm.

Entonces, cuando verifico con el modo detallado. Descubrí que no funciona con preinst.

La razón es que ptyhon install no puede aplicar el bloqueo y continuar con la instalación porque el proyecto ya lo ha bloqueado.

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.

Alguna sugerencia que puedas brindar

Para ser más específico, encuentre los detalles a continuación.

La herramienta que se utiliza para crear rpm:fpm Necesito instalar python3.8 como dependencia de las rpm de nuestra aplicación.

Si configuro eso como dependencia usando -d python3, estoy instalando la versión 3.7 en amazon linux y 3.6 en centos 8. Para usar la versión 3.8, se deben realizar algunos otros pasos antes de instalar el paquete.

Entonces, eliminé python3 de la sección de dependencia y agregué --before-install como script de shell.

Este es el script de shell que guardé allí.

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

Está activando el script pero se bloquea en la instalación de Python desde el script de Shell.

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.

Alguna sugerencia en como arreglar esto?

Mi requisito es instalar python3.8 como parte de las rpm de nuestro producto y también como una dependencia.

Respuesta1

Instalar rpms en scripts de otro rpm no funciona. Ya en una transacción rpm. Además, las dependencias no están en los metadatos del paquete y yum/dnf no puede resolverlas. Cualquiera de estos es una mala experiencia de usuario.

Es posible realizar múltiples distribuciones en una especificación de rpm con el uso creativo de condicionales. Supongamos que necesita al menos Python 3.8. Préstamo de varios paquetes rpmen CentOS y en otros lugares, el departamento de compilación podría verse así:

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

Tenga en cuenta el extraño número con prefijo cero. Esto permite su uso en expresiones incluso si la variable no está definida.

Continua conPautas de empaquetado de Python para Fedora(o EL) para %instalar la cosa. Una cosa complicada: para algunas de estas distribuciones, Python es /usr/bin/python3 y otras /usr/bin/python38. Es posible que desee convertir eso en una variable.

El repositorio adicional de Amazon python3.8 no está habilitado de forma predeterminada. Habilítelo para la compilación del paquete, por ejemplo en los repositorios de la herramienta simulada. Los usuarios también deberán habilitar el repositorio para instalar estos paquetes.

Las macros de empaquetado de Fedora generalmente generarán dependencias apropiadas para los módulos de Python instalados en ubicaciones típicas como %{python3_sitelib}. No sé de antemano qué hace amzn para esto, probablemente lo mismo. De lo contrario, es posible que deba agregar departamentos manuales, comoRequires: python(abi) = 3.8

Cree el archivo de especificaciones resultante en cada distribución única de interés: Fedora, RHEL, Amazon Linux, CentOS Stream, SUSE. Si bien un paquete ligeramente diferente para cada uno es molesto, el resultado es una experiencia de instalación fácil para los usuarios.

Los paquetes de Debian son un ejercicio para el lector.


Es posible que los generadores automáticos de paquetes como fpm no generen paquetes tan inteligentes. Compensación clásica: generador rápido para admitir múltiples distribuciones, versus un empaquetador humano que puede hacer algo intencional con las peculiaridades de las distintas distribuciones.

información relacionada