fpm을 사용하여 애플리케이션 rpm 파일을 구축했습니다. 거기에서 python3을 종속성으로 설정했으므로 기본 rpm 전에 자동으로 설치됩니다.
하지만 3.7을 설치하는 중입니다. 이를 3.8로 교체하려면 Centos인지 awslinux인지 먼저 OS 버전을 확인하고 이를 기반으로 특정 rpm을 설치해야 합니다.
그래서 preinst 스크립트에 이러한 조건부 블록을 유지하고 --before-install 매개변수에 전달했습니다.
그러나 rpm 설치 중에 멈춤 현상이 발생합니다.
그래서 verbose 모드로 확인할 때. 나는 그것이 preinst와 작동하지 않는다는 것을 알았습니다.
그 이유는 ptyhon 설치가 잠금을 적용할 수 없고 projectn이 이미 잠금을 획득했기 때문에 설치를 계속할 수 없기 때문입니다.
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.
당신이 제공할 수 있는 모든 제안
좀 더 구체적으로 알아보려면 아래 세부정보를 확인하세요.
rpm 생성에 사용되는 도구:fpm out 애플리케이션 rpm에 대한 종속성으로 python3.8을 설치해야 합니다.
-d python3을 사용하여 종속성을 설정하면 Amazon Linux에는 3.7 버전이 설치되고 centos 8에는 3.6 버전이 설치됩니다. 3.8 버전을 사용하려면 패키지를 설치하기 전에 수행해야 할 몇 가지 다른 단계가 있습니다.
그래서 종속성 섹션에서 python3을 제거하고 --before-install에 쉘 스크립트로 추가했습니다.
이것이 제가 거기에 보관했던 쉘 스크립트입니다.
#!/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
스크립트를 트리거하지만 쉘 스크립트에서 Python 설치가 중단됩니다.
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.
이 문제를 해결하는 방법에 대한 제안이 있으십니까?
내 요구 사항은 Python3.8을 제품 rpm의 일부로 종속성으로 설치하는 것입니다.
답변1
다른 rpm의 스크립트에 rpm을 설치하면 작동하지 않습니다. 이미 rpm 트랜잭션이 진행 중입니다. 또한 종속성은 패키지 메타데이터에 없으며 yum/dnf는 이를 확인할 수 없습니다. 둘 중 하나는 사용자 경험이 좋지 않습니다.
조건문을 창의적으로 사용하면 하나의 rpm 사양에 여러 배포판이 가능합니다. 최소한 Python 3.8이 필요하다고 가정해 보겠습니다. 다양한 rpm 패키지에서 차용CentOS에서 그리고 다른 곳에서도, 빌드 dep는 다음과 같습니다.
%if 0%{?fedora} || 0%{?rhel} > 8
BuildRequires: python3-devel
%endif
%if 0%{?amzn} || 0%{?rhel} == 8 || 0%{?suse_version} > 1500
BuildRequires: python38-devel
%endif
접두사가 0인 이상한 숫자에 주목하세요. 이를 통해 변수가 정의되지 않은 경우에도 표현식에 사용할 수 있습니다.
계속Fedora용 Python 패키징 지침(또는 EL) %를 설치합니다. 한 가지 까다로운 점: 이러한 배포판 중 일부의 경우 Python은 /usr/bin/python3이고 다른 일부는 /usr/bin/python38입니다. 그것을 변수로 만들고 싶을 수도 있습니다.
Amazon extra repo python3.8은 기본적으로 활성화되어 있지 않습니다. 예를 들어 모의 도구의 저장소에서 패키지 빌드에 대해 활성화합니다. 또한 사용자는 이러한 패키지를 설치하려면 저장소를 활성화해야 합니다.
Fedora 패키징 매크로는 일반적으로 %{python3_sitelib}와 같은 일반적인 위치에 설치된 Python 모듈에 대한 적절한 종속성을 생성합니다. amzn이 이에 대해 무엇을 하는지는 잘 모르겠습니다. 아마도 동일할 것입니다. 그렇지 않은 경우 다음과 같은 수동 deps를 추가해야 할 수도 있습니다.Requires: python(abi) = 3.8
관심 있는 각 고유 배포판(Fedora, RHEL, Amazon Linux, CentOS Stream, SUSE)에서 결과 사양 파일을 빌드합니다. 각각에 대해 약간 다른 패키지가 짜증나지만 결과적으로 사용자에게는 쉬운 yum 설치 경험이 제공됩니다.
데비안 패키지는 독자를 위한 연습입니다.
fpm과 같은 자동 패키지 생성기는 영리한 패키지로 출력되지 않을 수 있습니다. 고전적인 트레이드오프: 여러 배포판을 지원하는 빠른 생성기와 여러 배포판의 단점을 사용하여 의도적인 작업을 수행할 수 있는 인간 패키저입니다.