एक RPM कल्पना फ़ाइल में "इस या उस" पैकेज की आवश्यकता हो सकती है?


30

क्या किसी को पता है कि (या क्या कोई) एक वैकल्पिक आवश्यकता या विशिष्ट फ़ाइल में आवश्यकताओं के सेट को निर्दिष्ट कर सकता है, एक एकल आवश्यकता के विपरीत?

उदाहरण के लिए, मान लें कि दो पैकेज उपलब्ध हैं, आसानी से नाम दिए गए हैं foo-barऔर bar-foo। मेरे पैकेज के लिए इनमें से एक की आवश्यकता है, लेकिन दोनों की नहीं, और मुझे परवाह नहीं है कि कौन मौजूद है। रनटाइम के दौरान मैं जो भी उपलब्ध है का उपयोग करता हूं।

इतना प्रभावी ढंग से मैं कहना चाहूंगा:

Requires: foo-bar OR bar-foo

जहां तक ​​मैं बता सकता हूं कि यह संभव नहीं है, लेकिन मुझे लगता है कि यहां ऐसे लोग हैं जो आरपीएम के बारे में बहुत कुछ जानते हैं, इसलिए शायद ऐसा करने का एक तरीका है।

अद्यतन: मैं केवल की पैकेजिंग को नियंत्रित करता हूं bar-foo, नहीं foo-bar, इसलिए दोनों एक आभासी पैकेज प्रदान करने से काम नहीं चलेगा।

अद्यतन: मुझे वास्तव में जिस चीज की आवश्यकता है वह स्वयं प्रत्येक पैकेज के अंदर एक आभासी पैकेज है। कहते हैं foo-bar provides eagle' andबार-फू बीगल and my package works with either (or both); but other packages require eitherईगल orबीगल orफू-बार orबार-फू` प्रदान करता है , और लक्ष्य प्रणाली या तो स्थापित हो सकती है या दोनों स्थापित हो सकती है।

मैं वर्तमान में इसे एक %preस्क्रिप्ट के साथ हल करने की ओर झुक रहा हूं जो कुछ इस तरह करता है:

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

हालांकि मुझे पूरा यकीन है कि यह काम करेगा, यह आरपीएम की निर्भरता की एक क्रूर परिधि की तरह लगता है। उदाहरण के लिए, आपने मेरे पैकेज को कभी नहीं पूछा जब आप पूछेंगे whatrequires foo-barया whatrequires beagle

अद्यतन: दूसरे विचार पर, लोगों को स्थापित करने की आवश्यकता का दर्द foo-barजहां वे आरपीएम निर्भरता प्रबंधन को कम करने के दर्द से कम नहीं हो सकते हैं, कम से कम मेरी स्थिति के लिए। इसलिए जब तक किसी को "यह या वह" ठीक से करने की आवश्यकता नहीं है, (जो मुझे लगता है कि आरपीएम में आम तौर पर होने के लिए एक शानदार सुविधा होगी) तो मुझे केवल foo-bar और फिर, रनटाइम पर, यदि bar-fooउपलब्ध हो तो मुझे इसकी आवश्यकता होगी। मुझे जो भी मापदंड चाहिए उसके अनुसार।

अद्यतन: एक अन्य विचार, जो आरपीएम को धोखा भी देगा लेकिन हो सकता है कि वह सही स्थिति में हो। हो सकता है कि, मैं, %postRPM के डेटाबेस से सीधे संपर्क कर सकूं। इस प्रकार %preमुझे एक अवैध इंस्टाल से बचा सकता है, और %postआरपीएम को पूर्वव्यापी रूप से बताएगा कि जब मैं इंस्टॉल करता हूं, तो foo-barउसके bar-fooआधार पर मुझे या तो या दोनों की आवश्यकता होती है ।

सुझाव के लिए धन्यवाद!


मुझे पता है यह बहुत पुराना है; लेकिन क्या अब इसके लिए कोई अच्छा उपाय है? मैं एक RPM बना रहा हूँ जिसमें आवश्यकता में java-1.6.0-openjdk है: पंक्ति; लेकिन जावा 7 के साथ; मैं java-1.7.0-Openjdk का समर्थन करना चाहूंगा, लेकिन उन दोनों में से किसी एक को लगाने के लिए एक अच्छा तरीका नहीं निकाल सकता:
vpram86

यदि आप बार-फू की पैकेजिंग को नियंत्रित करते हैं Provides: foo-bar, तो इसका एक संभावित समाधान इसके साथ निर्माण करना है , इसलिए यह दोनों निर्भरता को संतुष्ट करता है। नए आरपीएम संस्करणों के लिए, बूलियन डिपेंडेंसीज की जांच करें । से दूर रहना %preऔर %postवर्गों, प्रणाली को हराने के लिए कोशिश मत करो
फोर्सफेक

जवाबों:


13

यह अब RPM 4.13 के रूप में संभव है।

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

यह इस तरह सरल हो सकता है: Requires: (pkgA >= 3.2 or pkgB)


दस्तावेज़ से ऐसा लगता है कि इनका उपयोग आवश्यकता के साथ नहीं किया जा सकता है, केवल 'कमजोर' निर्भरता सही है?
dsollen

दूसरी कड़ी से पता चलता है कि उनका उपयोग आवश्यकता के साथ किया जा सकता है। पहला लिंक यह उल्लेख करता है कि फेडोरा में इसका उपयोग करने की अनुमति नहीं है, लेकिन यह कस्टम पैकेजों पर लागू नहीं होगा।
carlwgeorge

9

इस तरह का व्यवहार पहले से ही कई पैकेजों द्वारा किया जाता है, उदाहरण के लिए मेल ट्रांसपोर्ट एजेंट। वे वर्चुअल पैकेज आपके सिस्टम को यह जानने का एक तरीका प्रदान करते हैं कि क्या उनकी क्षमता की आवश्यकता पहले से ही किसी अन्य कार्यक्रम द्वारा प्रदान की गई है।

देखें कि क्या rpm.org में वर्चुअल पैकेज उदाहरण में मदद करता है।


धन्यवाद। मुझे नहीं लगता कि वर्चुअल पैकेज यहां मेरी विशिष्ट समस्या को हल करेंगे, लेकिन मैं मानता हूं कि वे बहुत उपयोगी हैं। मेरे मामले में मैं दोनों द्वारा प्रदान की कुछ आम सुविधा की आवश्यकता नहीं करना चाहती foo-barऔर bar-foo, और के बाद से मैं नियंत्रण नहीं की पैकेजिंग foo-barमैं सिर्फ उन दोनों को प्रदान नहीं कर सकते support-for-mypackage। अगर मैंने दोनों वैकल्पिक पूर्वापेक्षाओं की पैकेजिंग को नियंत्रित किया तो वास्तव में एक साझा वर्चुअल पैकेज एक बेहतरीन समाधान होगा।
केविन फ्रॉस्ट

5

दो संभावनाएँ:

यदि आप foo-barऔर bar-fooआपके द्वारा उपयोग किया जाने वाला हिस्सा एक सामान्य फ़ाइल है, तो आप बस Require /path/to/file(मुझे ऐसा लगता है; मेरा परीक्षण सीमित था)।

आपकी स्थिति वैकल्पिक निर्भरताओं के समान है। जिस तरह से उन्हें संभाला जाता है X-commonउसके पास एक X-foo-barपैकेज होता है और फिर एक पैकेज होता है जिसके लिए आवश्यकता होती है foo-barऔर एक X-bar-fooपैकेज की आवश्यकता होती है bar-foo


दुर्भाग्य से कोई आम फाइलें नहीं हैं। यदि यह संभावित रूप से खतरनाक है, तो यह एक अच्छी चाल होगी: भविष्य के कुछ संस्करण foo-barइसकी फाइलों को इधर-उधर कर सकते हैं (मैं केवल bar-fooयहां नियंत्रण करता हूं )। वैकल्पिक निर्भरताएं दिलचस्प हैं, लेकिन काफी नहीं जो मुझे चाहिए, क्योंकि मुझे वास्तव में या तो ज़रूरत है foo-bar या bar-foo ; वैकल्पिक एकमात्र विकल्प है, जिसमें से विकल्प। जवाब के लिए धन्यवाद।
केविन फ्रॉस्ट

इससे मेरी समस्या हल हो गई! विभिन्न GNU / लिनक्स फ्लेवर अलग-अलग python3 वर्चुअल पैकेज प्रदान करते हैं: python3, python34, python35, इत्यादि। मेरे सिंगल पैकेज के लिए उन सभी पर काम करने के लिए, मैं बस इस्तेमाल कर पा रहा थाRequire: /usr/bin/python3
bgStack15

0

क्या यह आपके लिए काम करेगा कि आपका पैकेज बार-फू आभासी पैकेज फू-बार प्रदान करे?

फिर आप बस अपने burp-baz पैकेज को फू-बार की आवश्यकता कर सकते हैं।


यदि उपरोक्त करना कंजूसी महसूस करता है (यह संभवतः है) तो आपको अपने आरपीएम के दो संस्करण बनाने की आवश्यकता हो सकती है, एक पर निर्भर करता है foo-barऔर दूसरा निर्भर करता है bar-foo


प्रलोभन, लेकिन खतरनाक: कुछ और, जो वास्तव में जरूरत है foo-bar, तब टूट जाएगा अगर यह सोचा कि bar-fooकुछ ऐसा प्रदान कर रहा था जो वास्तव में नहीं था। चिपके बिंदु यह है कि मेरे पैकेज के लिए मुझे किसी और चीज की जरूरत है लेकिन दोनों की नहीं; लेकिन किसी भी अन्य पैकेज को वास्तव में उनमें से सिर्फ एक की आवश्यकता हो सकती है। और मुझे केवल दोनों की आवश्यकता नहीं हो सकती है, क्योंकि वास्तविक मामले हैं जहां केवल एक या दूसरे उपलब्ध होंगे।
केविन फ्रॉस्ट

-2

स्वचालित प्रणालियों में गैर-नियतत्ववाद (जो या तो निर्भरता प्रबंधन है या आरपीएम का उपयोग करने वाली मशीनें) वास्तव में बहुत बुरी बात है। आप इसे इस या उस स्थिति पर विफल करना चाहते हैं, क्योंकि असफल होना अभी भी एक अप्रत्याशित परिणाम जितना बुरा नहीं है।

समस्या को हल करने के लिए, शायद आपके पास वह पैकेज है जो नियंत्रण% मुख्य टोकन प्रदान करता है जो अपरिवर्तनीय पैकेज भी% प्रदान करने के लिए होता है और जो आपके अन्य सॉफ़्टवेयर% निर्भर करता है; तब आपके पैकेज% ने अपरिवर्तनीय का पालन किया है। खासकर यदि यह पहले से ही है, तो आप इसे अन्य इंस्टॉल पर जीत सकते हैं।

पैकेजिंग और उचित निर्भरता और स्थापित संचालन मुश्किल काम है। लक्ष्य - विश्वसनीय, दोहराने योग्य, श्रवण स्थापित - इतना मूल्यवान है कि आप इसे सही होने के लाभ का एहसास कर सकते हैं।

निर्भरता नरक आत्म-प्रवृत्त है। कोई अपवाद नहीं


यहां वह मछली है जो मैं आपको दूंगा: आपको दोनों में से केवल एक की आवश्यकता है क्योंकि दोनों कुछ फ़ाइल या संसाधन प्रदान करते हैं। इसलिए, पैकेज के नाम पर% निर्भर नहीं करते, बस उस फ़ाइल या संसाधन पर जो वे प्रदान करते हैं। हां, आप अभी भी गैर-नियतत्ववाद का पालन कर रहे हैं, लेकिन अगर आप वास्तव में सीधे आरपीएमडीबी के साथ छेड़छाड़ करने पर विचार कर रहे हैं, तो आप पहले से ही उन जोखिमों पर गौर कर रहे हैं, जिनसे अधिकांश लोग बचना सीख चुके हैं। मुझे आशा है कि आप एक ऐसा समाधान पा सकते हैं जो इस तरह के तकनीकी ऋण को पूरा नहीं करता है।
user2066657
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.