หนึ่งสามารถต้องการแพคเกจ "นี้หรือที่" ในไฟล์ RPM spec หรือไม่


30

ไม่มีใครรู้วิธีการ (หรือว่าสามารถทำได้) ระบุข้อกำหนดสำรองหรือชุดข้อกำหนดในไฟล์ข้อมูลจำเพาะซึ่งตรงข้ามกับข้อกำหนดเดียวหรือไม่?

ตัวอย่างเช่นสมมติว่ามีสองแพคเกจใช้ได้ชื่อสิ่งอำนวยความสะดวกและfoo-bar bar-fooแพ็คเกจของฉันต้องการหนึ่งในสิ่งเหล่านี้ แต่ไม่ใช่ทั้งสองอย่างและฉันไม่สนใจว่าจะใช้อันไหน ที่รันไทม์ฉันใช้แล้วแต่จำนวนใดจะว่าง

อย่างมีประสิทธิภาพฉันต้องการวิธีที่จะพูดว่า:

Requires: foo-bar OR bar-foo

เท่าที่ฉันสามารถบอกได้ว่ามันเป็นไปไม่ได้ แต่ฉันคิดว่ามีคนที่นี่รู้มากเกี่ยวกับ RPM มากกว่าที่ฉันทำดังนั้นอาจมีวิธีที่จะทำ

UPDATE: ฉันเพียงควบคุมบรรจุภัณฑ์ของbar-fooไม่ใช่foo-barเพื่อให้ทั้งสองให้แพคเกจเสมือนจะไม่ทำงาน

UPDATE: สิ่งที่ฉันต้องการจริง ๆ ก็คือแพ็คเกจเสมือนภายในแพ็คเกจแต่ละชุด สมมติว่าfoo-bar provides eagle' andbar-foo จัดเตรียมบีเกิ้ลand my package works with either (or both); but other packages require eithereagle orbeagle orfoo-bar orbar-foo` และระบบเป้าหมายสามารถติดตั้งได้ทั้งแบบใดแบบหนึ่งหรือทั้งสองแบบ

ฉันกำลังโน้มตัวไปแก้ปัญหาด้วย%preสคริปต์ที่ทำสิ่งที่ชอบ:

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

ในขณะที่ฉันค่อนข้างแน่ใจว่าจะใช้งานได้ดูเหมือนว่าจะเป็นการหลีกเลี่ยงการติดตามการพึ่งพาของ RPM ที่โหดร้าย ตัวอย่างเช่นคุณไม่เคยเห็นแพคเกจของฉันเมื่อคุณถามหรือwhatrequires foo-barwhatrequires beagle

UPDATE: ในความคิดที่สองความเจ็บปวดจากการให้ผู้คนติดตั้งfoo-barที่พวกเขาอาจจะไม่น้อยไปกว่าความเจ็บปวดของการหลีกเลี่ยงการจัดการการพึ่งพารอบต่อนาทีอย่างน้อยก็สำหรับสถานการณ์ของฉัน ดังนั้นหากไม่มีใครมาพร้อมกับวิธีการที่จะต้องมี "นี่หรือที่" (ซึ่งฉันคิดว่าจะเป็นคุณสมบัติที่ดีที่จะมีใน RPM โดยทั่วไป) จากนั้นฉันวางแผนที่จะต้องการเพียงอย่างเดียว foo-barแล้วที่รันไทม์ถ้าbar-fooมี ตามเกณฑ์ที่ฉันต้องการ

UPDATE: แนวคิดอื่นซึ่งจะเป็นการโกง RPM แต่อาจทำให้สิ่งต่าง ๆ เข้าสู่สถานะที่ถูกต้อง บางทีฉันก็สามารถทำ%postซอกับฐานข้อมูลของ RPM ได้โดยตรง ดังนั้นจึง%preสามารถปกป้องผมจากการที่ไม่ถูกต้องติดตั้งและ%postมีผลย้อนหลังจะบอก RPM ที่ฉันจำเป็นต้องใช้อย่างใดอย่างหนึ่งfoo-barหรือbar-fooหรือทั้งสองอย่างขึ้นอยู่กับสิ่งที่มีเมื่อติดตั้ง

ขอบคุณสำหรับคำแนะนำ!


ฉันรู้ว่ามันเก่ามาก แต่ตอนนี้มีทางออกที่ดีสำหรับเรื่องนี้หรือไม่? ฉันกำลังสร้าง RPM ซึ่งมี java-1.6.0-openjdk ในต้องการ: line; แต่ด้วย java7; ฉันต้องการสนับสนุน java-1.7.0-openjdk เช่นกัน แต่ไม่สามารถหาวิธีที่ดีที่จะนำสองอย่างนี้มาใช้ต้องการ:
vpram86

หากคุณควบคุมบรรจุภัณฑ์ของ bar-foo ทางออกหนึ่งที่เป็นไปได้คือสร้างด้วยProvides: foo-barดังนั้นจึงเป็นไปตามการพึ่งพาทั้งสอง สำหรับรุ่นใหม่รอบต่อนาทีให้ตรวจสอบบูลีอ้างอิง อยู่ห่างจาก%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-barและbar-fooและตั้งแต่ฉันไม่ควบคุมบรรจุภัณฑ์ของฉันไม่สามารถเพียงแค่ทำให้พวกเขาทั้งสองให้foo-bar support-for-mypackageถ้าฉันควบคุมบรรจุภัณฑ์ของสิ่งที่จำเป็นต้องมีสำรองทั้งคู่แน่นอนว่าแพคเกจเสมือนที่ใช้ร่วมกันจะเป็นทางออกที่ดี
Kevin Frost

5

ความเป็นไปได้สองอย่าง:

หากส่วนหนึ่งfoo-barและbar-fooคุณใช้เป็นไฟล์ทั่วไปคุณสามารถทำได้Require /path/to/file(ฉันคิดอย่างนั้นการทดสอบของฉันมี จำกัด )

สถานการณ์ของคุณคล้ายกับการอ้างอิงเพิ่มเติม วิธีที่พวกเขาได้รับการจัดการที่จะมีX-commonแพคเกจแล้วมีX-foo-barแพคเกจที่ต้องใช้foo-barและแพคเกจที่ต้องใช้X-bar-foobar-foo


ไม่มีไฟล์ทั่วไปโชคไม่ดี นั่นอาจเป็นเคล็ดลับที่เยี่ยมยอดหากมี แต่อาจเป็นอันตรายได้: เวอร์ชันในอนาคตของบางรุ่นfoo-barสามารถย้ายไฟล์ไปรอบ ๆ ได้ (ฉันควบคุมbar-fooที่นี่เท่านั้น) พึ่งพาตัวเลือกที่น่าสนใจ แต่ไม่มากสิ่งที่ฉันต้องการตั้งแต่ผมทำจริงๆจำเป็นอย่างใดอย่างหนึ่ง foo-bar หรือ bar-foo ; สิ่งเดียวที่เป็นตัวเลือกคือตัวเลือกที่ ขอบคุณที่ตอบกลับ
Kevin Frost

นี่เป็นการแก้ไขปัญหาของฉัน! รสชาติ GNU / Linux ที่แตกต่างกันมีแพ็คเกจเสมือน python3 ที่แตกต่างกัน: python3, python34, python35 และอื่น ๆ เพื่อให้แพ็คเกจเดียวของฉันสามารถใช้งานได้กับทุกแพ็คเกจฉันสามารถใช้งานได้Require: /usr/bin/python3
bgStack15 15

0

มันจะทำงานสำหรับคุณที่จะมีแพคเกจ bar-foo ของคุณให้แพคเกจเสมือน foo-bar?

จากนั้นคุณสามารถสร้างแพ็กเกจ burp-baz ของคุณต้องใช้ foo-bar


ถ้าทำรู้สึกข้างต้น skeezy (มันน่าจะเป็น) คุณอาจจำเป็นต้องสร้างสองรุ่น RPM ของคุณหนึ่งขึ้นอยู่กับfoo-barและอื่น ๆ bar-fooขึ้นอยู่กับ


การล่อลวง แต่อันตราย: อย่างอื่นที่ต้องการจริงๆfoo-barแล้วจะแตกถ้ามันคิดว่าbar-fooให้อะไรที่มันไม่จริง จุดยึดคือสำหรับแพ็คเกจของฉันฉันต้องการสิ่งที่จำเป็นต้องมีอย่างใดอย่างหนึ่งแต่ไม่ใช่ทั้งสองอย่าง แต่แพ็คเกจอื่นอาจต้องการเพียงหนึ่งแพ็คเกจเท่านั้น และฉันก็ไม่ต้องการทั้งสองอย่างเช่นกันเนื่องจากมีกรณีจริงที่จะมีให้เลือกอย่างใดอย่างหนึ่งเท่านั้น
Kevin Frost

-2

การไม่กำหนดในระบบอัตโนมัติ (ซึ่งก็คือการจัดการการพึ่งพาหรือเครื่องที่ใช้ RPMs) เป็นสิ่งที่เลวร้ายจริงๆ คุณต้องการให้มันล้มเหลวในสถานการณ์นี้หรือว่าเนื่องจากความล้มเหลวยังไม่เลวเท่าผลลัพธ์ที่ไม่คาดคิด

ในการแก้ปัญหาอาจมีแพ็คเกจที่คุณควบคุม% ให้โทเค็นหลักว่าแพ็คเกจที่ไม่เปลี่ยนรูปนั้นยังเกิดขึ้นกับ% ให้และซอฟต์แวร์อื่น ๆ ของคุณขึ้นอยู่กับ%; จากนั้นให้% แพ็คเกจของคุณล้าสมัยอันไม่เปลี่ยนรูป โดยเฉพาะถ้ามันมีอยู่แล้วคุณอาจทำให้มันชนะในการติดตั้งอื่น ๆ

บรรจุภัณฑ์และการพึ่งพาที่เหมาะสมและการติดตั้งเป็นงานที่ยุ่งยาก เป้าหมาย - การติดตั้งที่เชื่อถือได้ทำซ้ำและตรวจสอบได้ - มีคุณค่ามากจนคุณอาจตระหนักถึงประโยชน์ที่จะได้รับ

นรกพึ่งพาตนเองได้ ไม่มีข้อยกเว้น


นี่คือปลาที่ฉันจะให้คุณ: คุณต้องการเพียงหนึ่งในสองเพราะทั้งสองมีไฟล์หรือทรัพยากรบางอย่าง ดังนั้นอย่า% ขึ้นอยู่กับชื่อของแพคเกจเพียงแค่ไฟล์หรือทรัพยากรที่พวกเขาให้ ใช่คุณจะยังคงติดพันไม่ใช่ระดับ แต่ถ้าคุณกำลังพิจารณาการล้อเล่นรอบต่อนาทีโดยตรงคุณก็ยินดีที่จะพิจารณาความเสี่ยงที่คนส่วนใหญ่เรียนรู้ที่จะหลีกเลี่ยง ฉันหวังว่าคุณจะพบทางออกที่ไม่ก่อให้เกิดหนี้สินทางเทคนิคดังกล่าว
user2066657
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.