RPM 사양 파일에“this OR that”패키지가 필요할 수 있습니까?


30

누구나 단일 요구 사항이 아닌 사양 파일에서 대체 요구 사항 또는 요구 사항 집합을 지정하는 방법 (또는 가능 여부)을 알고 있습니까?

예를 들어, 편리라는 이름의 두 가지 패키지가있다라고 foo-bar하고 bar-foo. 내 패키지에는 이들 중 하나가 필요하지만 둘 다 필요하지는 않으며 어느 패키지가 있는지 상관하지 않습니다. 런타임에 사용 가능한 것을 사용합니다.

그래서 효과적으로 말하는 방법을 원합니다.

Requires: foo-bar OR bar-foo

그것이 불가능하다는 것을 알 수있는 한, 여기보다 RPM에 대해 더 많이 알고있는 사람들이 있다고 생각하므로 그렇게 할 수있는 방법이 있습니다.

업데이트 : 난 단지의 포장을 제어 bar-foo하지, foo-bar그래서 모두가 가상 패키지가 작동하지 않습니다 제공 필요.

업데이트 : 실제로 필요한 것은 각 패키지 내부 의 가상 패키지입니다. 말의 foo-bar provides eagle' and바 - 푸 비글 제공 and my package works with either (or both); but other packages require either독수리 or비글 orfoo는 바 or바 foo` 및 대상 시스템이 가질 수 중 하나 또는 둘 모두가 설치되어 있어야합니다.

나는 현재 다음과 같은 %pre스크립트를 사용 하여이 문제를 해결하려고합니다 .

rpm -q eagle || rpm -q beagle || echo "need eagle or beagle" && /bin/false

나는 그것이 효과가 있다고 확신하지만 RPM의 의존성 추적을 잔인하게 우회하는 것처럼 보입니다. 당신이 물었을 때 예를 들어 당신이 내 패키지를 볼 수 없을 것 whatrequires foo-barwhatrequires beagle.

업데이트 : 두 번째 생각으로, 사람들이 설치할 foo-bar수 있도록 해야하는 고통은 적어도 내 상황에서 RPM 종속성 관리를 우회하는 고통보다 적습니다. 따라서 누군가가 "this OR that"을 올바르게 요구하는 방법을 제시하지 않는 한 (일반적으로 RPM에서 갖는 훌륭한 기능이라고 생각합니다), 필요한 경우 에만 계획 foo-bar하고 런타임에 bar-foo사용 가능한 경우 다음 중 하나를 선택합니다. 내가 원하는 기준에 따라

업데이트 : 또 다른 아이디어는 RPM을 부정하지만 물건을 올바른 상태로 만들 수 있습니다. 에서에서 %postRPM의 데이터베이스를 직접 사용할 수도 있습니다. 따라서 %pre설치 잘못된에서 저를 보호 할 수 있고, %post나도 필요로하는 소급 RPM을 말할 것 foo-barbar-foo또는 두 가지 모두, 무엇에 따라 내가 거기 설치할 때.

제안 해 주셔서 감사합니다!


나는 이것이 매우 오래되었다는 것을 안다. 그러나 지금 이것에 대한 좋은 해결책이 있습니까? 요구 사항에 java-1.6.0-openjdk가있는 RPM을 만들고 있습니다 : line; 그러나 java7; java-1.7.0-openjdk도 지원하고 싶지만 요구 사항에 두 가지 중 하나를 넣을 수있는 좋은 방법을
찾지 못했습니다

bar-foo 패키징을 제어하는 ​​경우 가능한 솔루션 중 하나를 사용하여 패키지를 빌드하면 Provides: foo-bar두 가지 종속성을 모두 만족시킬 수 있습니다. 최신 rpm 버전의 경우 부울 종속성을 확인하십시오 . 멀리 %pre하고 %post, 섹션 시스템을 물리 칠하려고하지 않습니다 .
forcefsck

답변:


13

RPM 4.13부터 가능합니다.

https://rpm.org/user_doc/boolean_dependencies.html

다음과 같이 간단 할 수 있습니다. Requires: (pkgA >= 3.2 or pkgB)


문서에서 요구 사항과 함께 사용할 수없는 것처럼 보이며 '약한'종속성 만 정확합니까?
dsollen

두 번째 링크는 요구 사항과 함께 사용할 수 있음을 보여줍니다. 첫 번째 링크에서는 Fedora에서는이 방법을 사용하는 것이 허용되지 않지만 사용자 정의 패키지에는 적용되지 않는다고 언급합니다.
carlwgeorge

9

이러한 종류의 동작은 이미 메일 전송 에이전트와 같은 여러 패키지에 의해 수행됩니다. 이러한 가상 패키지 는 필요한 기능이 다른 프로그램에서 이미 제공되고 있는지 알 수있는 방법을 시스템에 제공합니다.

경우 참조 가상 패키지 rpm.org 예 당신을 도와줍니다.


감사. 가상 패키지가 내 특정 문제를 해결할 것이라고 생각하지 않지만 매우 유용하다는 데 동의합니다. 필자의 경우 foo-barbar-foo에서 제공하는 공통 기능이 필요 하지 않으며 패키징을 제어 foo-bar할 수 없기 때문에 둘 다 제공 할 수는 없습니다 support-for-mypackage. 두 가지 대체 전제 조건의 패키징을 제어 한 경우 실제로 공유 가상 패키지가 좋은 솔루션이됩니다.
Kevin Frost

5

두 가지 가능성 :

의 일부 경우 foo-barbar-foo사용이 일반적인 파일이 당신은 할 수 있습니다 Require /path/to/file(I는 생각 때문에, 내 시험이 제한되었다).

상황은 선택적 종속성과 유사합니다. 이들이 처리하는 방법은 X-common패키지 를 갖고 필요한 패키지와 X-foo-bar필요한 패키지를 foo-bar갖는 것 X-bar-foo입니다 bar-foo.


불행히도 공통 파일이 없습니다. 잠재적으로 위험한 경우에도 멋진 트릭이 될 것입니다. 향후의 일부 버전은 foo-bar파일을 이동할 수 있습니다 ( bar-foo여기서 만 제어 ). 옵션 의존성이 흥미하지만 내가 정말 필요 않기 때문에 확실히 내가 필요하지 무엇을 하나 foo-bar 또는 bar-foo ; 선택적인 것은 선택입니다. 답장을 보내 주셔서 감사합니다.
Kevin Frost

이것은 내 문제를 해결했습니다! 다른 GNU / Linux 버전은 python3, python34, python35 등의 python3 가상 패키지를 제공합니다. 단일 패키지가 모든 패키지에서 작동하도록하기 위해 다음과 같은 기능을 사용할 수있었습니다.Require: /usr/bin/python3
bgStack15

0

패키지 bar-foo가 가상 패키지 foo-bar를 제공하도록하는 것이 효과가 있습니까?

그런 다음 burp-baz 패키지에 foo-bar가 필요하도록 만들 수 있습니다.


위와 같이하면 어색한 느낌이들 수 있습니다 (아마도), 두 가지 버전의 RPM을 만들어야 할 수도 있습니다 (하나는에 foo-bar따라 다름) bar-foo.


유혹적이지만 위험합니다. 실제로 필요한 것은 실제로 필요 하지 않은 것을 제공 foo-bar한다고 생각되면 깨질 것 bar-foo입니다. 고집 포인트는 패키지 에 전제 조건 중 하나 가 필요 하지만 둘 다 필요 하지 않다는 것입니다. 그러나 다른 패키지는 실제로 하나만 필요할 수도 있습니다. 그리고 하나만 사용할 수있는 실제 사례가 있기 때문에 둘 다 필요하지는 않습니다.
Kevin Frost

-2

자동화 된 시스템 (종속성 관리 또는 RPM을 사용하는 시스템)의 비결 정성은 실제로 나쁜 일입니다. 실패는 여전히 예상치 못한 결과만큼 나쁘지 않기 때문에이 상황에서 실패하고 싶을 것입니다.

이 문제를 해결하기 위해, 당신이 통제하는 패키지가 불변 패키지가 제공하고 다른 소프트웨어가 의존하는 주 토큰을 제공하도록 할 수 있습니다. 그런 다음 패키지가 변경 불가능한 것을 더 이상 사용하지 않도록하십시오. 특히 이미 설치되어 있으면 다른 설치에서 이길 수 있습니다.

패키징과 적절한 종속성 및 설치 작업은 까다로운 작업입니다. 신뢰할 수 있고 반복 가능하며 감사 가능한 설치라는 목표는 가치가 있기 때문에 올바른 결과를 얻을 수 있습니다.

의존성 지옥은 자해합니다. 예외 없음


내가 줄 물고기는 다음과 같습니다. 둘 다 파일이나 리소스를 제공하기 때문에 둘 중 하나만 필요합니다. 따라서 패키지 이름, 제공하는 파일 또는 리소스에만 의존하지 마십시오. 그렇습니다. 당신은 여전히 ​​비결정론에 구애 받게 될 것입니다. 그러나 실제로 rpmdb를 직접 사용하는 것을 고려하고 있다면, 대부분의 사람들이 피하는 법을 이미 잘 알고 있습니다. 그러한 기술적 부채가 발생하지 않는 솔루션을 찾을 수 있기를 바랍니다.
user2066657
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.