RPM özellikli bir dosyada “bu VEYA bu” paket istenebilir mi?


30

Tek bir gereklilik yerine, belirli bir dosyada alternatif bir gereksinim veya bir dizi gereksinim nasıl belirtileceğini (veya belirtip belirtemeyeceğini) bilen var mı?

Örneğin, uygun şekilde foo-barve adı verilen iki paket olduğunu varsayalım bar-foo. Paketim bunlardan birini gerektiriyor ama ikisini de değil, hangisinin mevcut olduğunu umursamıyorum. Çalışma zamanında uygun olanı kullanıyorum.

Çok etkili bir şekilde şöyle demeyi istiyorum:

Requires: foo-bar OR bar-foo

Bunun mümkün olmadığını söyleyebildiğim kadarıyla, burada RPM hakkında benden çok daha fazla şey bilen insanlar var, belki de bunu yapmanın bir yolu var.

GÜNCELLEME: Ben sadece paketini kontrol ediyorum bar-foo, değil foo-bar, bu yüzden her ikisi de sanal bir paket sağlamak işe yaramaz.

GÜNCELLEME: Gerçekte ihtiyacım olan şey, her bir paketin içinde sanal bir paket . Ki foo-bar provides eagle' andçubuk foo beagle içerir and my package works with either (or both); but other packages require eitherkartal orav orfoo çubuğu orçubuk foo` ve hedef sistemi ya da olabilir veya her ikisi de.

Şu anda bu gibi bir %preşey yapan bir komut dosyası ile çözme doğru eğilerek :

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

Bunun işe yarayacağından emin olduğum halde, RPM'nin bağımlılık izlemesinin acımasız bir şekilde çevrilmesi gibi görünüyor. Eğer sorulduğunda Mesela benim paketimi görmek asla whatrequires foo-barveya whatrequires beagle.

GÜNCELLEME: İkinci düşüncede foo-bar, en azından benim durumum için, insanların sahip olamayacakları bir yere kurmalarını isteme acıları, RPM bağımlılık yönetimini atlamanın acısından daha az. Bu nedenle, birileri "bu VEYA'yı" (genellikle RPM’de olması harika bir özellik olacağını düşünüyorum) gerektiği gibi istemediği bir yol bulamazsa , o zaman sadece talep etmeyi planlıyorum foo-barve sonra çalışma zamanında, varsa bar-fooihtiyacım olan kritere göre onları.

GÜNCELLEME: RPM'yi aldatan, ancak işleri doğru duruma getirebilecek başka bir fikir. Belki de %postRPM'nin veritabanına doğrudan girebilirim . Böylece %prebeni geçersiz bir kurulumdan koruyabilirdi ve %postRPM'yi, kurulum sırasında orada ne olduğuna bağlı olarak foo-barya bar-fooda her ikisine de ihtiyacım olduğunu söylerdi .

Önerileriniz için teşekkürler!


Bunun çok eski olduğunu biliyorum; peki bunun için şimdi iyi bir çözüm var mı? Java-1.6.0-openjdk olan bir RPM hazırlıyorum. ancak java7 ile; Java-1.7.0-openjdk'yi de desteklemek isterim ancak Aşağıdakilerden ikisini birden koymak için iyi bir yol
bulamadım

Eğer bar-foo paketini kontrol ederseniz, olası bir çözüm onu ​​inşa etmektir Provides: foo-bar, bu yüzden her iki bağımlılığı da karşılar. Daha yeni rpm sürümleri için Boolean Bağımlılıkları'nı kontrol edin . %preVe %postbölümlerden uzak durun , sistemi alt etmeye çalışmayın .
forcefsck

Yanıtlar:


13

Bu şimdi RPM 4.13'ten itibaren mümkün.

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

Sadece basit olabilir: Requires: (pkgA >= 3.2 or pkgB)


Bu belgelerin gerektirdiği gibi kullanılamaz gibi görünüyor, sadece 'zayıf' bağımlılıklar doğru mu?
17'de

İkinci bağlantı, Gereklilik ile kullanılabileceklerini gösterir. İlk bağlantı, bu şekilde kullanılmasına Fedora'da izin verilmediğini, ancak bunun özel paketler için geçerli olmadığını söylüyor.
carlwgeorge

9

Bu tür bir davranış zaten posta paketleri gibi çeşitli paketler tarafından gerçekleştiriliyor. Bu sanal paketler , sisteminize, ihtiyaç duydukları bir yeteneğin başka bir program tarafından sağlanmış olup olmadığını bilmek için bir yol sunar.

Rpm.org'daki sanal paketlerin size yardımcı olup olmadığına bakın .


Teşekkürler. Sanal paketlerin burada özel sorunumu çözeceğini sanmıyorum, ancak çok faydalı olduklarını kabul ediyorum. Benim durumumda ben hem sağladığı bazı ortak özelliği gerektiren istemiyorum foo-barve bar-foo, ben kontrol etmiyoruz yana ambalaj foo-barI sadece ikisini sağlayan yapamaz support-for-mypackage. Her iki alternatif önkoşulun paketlenmesini kontrol edersem, o zaman gerçekten paylaşılan bir sanal paket mükemmel bir çözüm olurdu.
Kevin Frost,

5

İki olasılık:

Eğer kullandığınız foo-barve bar-fookullandığınız kısım ortak bir dosya ise, sadece Require /path/to/file( sanırım ; testim sınırlıydı).

Durumunuz isteğe bağlı bağımlılıklara benzer. Onlar işlenir yolu sahip olmaktır X-commonpaketi ve daha sonra var X-foo-bargerektirir paketi foo-barve bir X-bar-foogerektirmektedir paketi bar-foo.


Maalesef ortak dosya yok. Potansiyel olarak tehlikeli olsa da, tehlikeli bir hile olurdu: Gelecekteki bazı sürümleri foo-bardosyalarını taşıyabilir (sadece bar-fooburada kontrol ediyorum ). Opsiyonel bağımlılıklar ilginç ama gerçekten ihtiyacı yapmak beri oldukça ben, gerek neyi ya foo-bar ya bar-foo ; İsteğe bağlı tek şey hangisinin seçimidir. Cevabınız için teşekkürler.
Kevin Frost

Bu benim sorunumu çözdü! Farklı GNU / Linux tatlar farklı python3 sanal paketler sunuyoruz: vb python3, python34, python35, Amacıyla hepsi çalışma benim tek paket için, sadece kullanım başardıRequire: /usr/bin/python3
bgStack15

0

Bar-foo paketinizin sanal bir foo-bar paketini sağlaması sizin için işe yarar mı?

Burp baz paketinizi sadece foo-bar gerektirecek şekilde yapabilirsiniz.


Yapıyor ise yukarıdaki hissettiğini skeezy (muhtemelen öyledir) Eğer RPM iki versiyonunu oluşturmak gerekebilir, tek bağlı foo-barve diğer bağlı bar-foo.


Baştan çıkarıcı, ancak tehlikeli: gerçekten ihtiyacı olan başka bir şey, gerçekten olmayan bir şey sağladığı foo-bardüşünülürse kırılır bar-foo. Yapışmasını nokta bunun için benim ihtiyacım olan paketin ya önkoşullar ancak ikisini arasında; fakat başka bir paket gerçekten bunlardan birine ihtiyaç duyabilir. Ve ikisine de gereksinim duymuyorum, çünkü yalnızca birinin veya diğerinin olabileceği gerçek durumlar var.
Kevin Frost,

-2

Otomatik sistemlerde determinizm olmayışı (bağımlılık yönetimi veya RPM kullanan makineler) gerçekten kötü bir şey. Başarısızlık hala beklenmedik bir sonuç kadar kötü olmadığı için, bu veya bu durumda başarısız olmak istersiniz.

Sorunu çözmek için, belki% DO kontrol ettiğiniz paketin değişmez paketin% sağladığı ve diğer yazılımınızın% 'inin bağlı olduğu temel belirteçleri sağlayın; Daha sonra, paketinizde% değişmez olanı geçersiz kılın. Özellikle zaten yerinde ise, diğer yüklemeye göre kazanabilirsiniz.

Paketleme ve uygun bağımlılık ve kurulum işlemleri zor iştir. Hedef - güvenilir, tekrarlanabilir, denetlenebilir kurulumlar - o kadar değerlidir ki, onu doğru yapmanın kazanımlarını gerçekleştirebilirsiniz.

Bağımlılık cehennemi kendi kendine bulaşır. İstisna yok


İşte size vereceğim balık: İkisinden yalnızca birine ihtiyacınız var çünkü ikisi de bir miktar dosya veya kaynak sağlıyor. Bu nedenle,% paketin adına, sadece sağladıkları dosyaya veya kaynağa bağlı değil. Evet, yine de determinizmden mahrum kalacaksınız, ancak aslında rpmdb ile doğrudan dalga geçmeyi düşünüyorsanız, çoğu insanın kaçınmayı öğrendiği riskleri neşeyle karşılıyorsunuz. Umarım böyle bir teknik borca ​​maruz kalmayan bir çözüm bulursunuz.
user2066657
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.