Apakah ada yang tahu bagaimana (atau apakah seseorang dapat) menentukan persyaratan alternatif atau serangkaian persyaratan dalam file spesifikasi, yang bertentangan dengan persyaratan tunggal?
Misalnya, ada dua paket yang tersedia, yang dinamai dengan mudah foo-bar
dan bar-foo
. Paket saya membutuhkan salah satu dari ini tetapi tidak keduanya, dan saya tidak peduli yang mana yang hadir. Saat runtime saya menggunakan mana yang tersedia.
Jadi secara efektif saya ingin mengatakan:
Requires: foo-bar OR bar-foo
Sejauh yang saya tahu itu tidak mungkin, tapi saya pikir ada orang di sini yang tahu lebih banyak tentang RPM daripada saya, jadi mungkin ada cara untuk melakukannya.
UPDATE: Saya hanya mengontrol kemasan bar-foo
, tidak foo-bar
, jadi memiliki keduanya menyediakan paket virtual tidak akan berfungsi.
UPDATE: Hal yang sebenarnya saya butuhkan adalah paket virtual di dalam masing-masing paket. Katakanlah foo-bar provides eagle' and
bar-foo menyediakan beagle and my package works with either (or both); but other packages require either
eagle or
beagle or
foo-bar or
bar-foo`, dan sistem target dapat menginstal salah satu atau keduanya.
Saat ini saya condong untuk menyelesaikan ini dengan %pre
skrip yang melakukan sesuatu seperti:
rpm -q eagle || rpm -q beagle || echo "need eagle or beagle" && /bin/false
Sementara saya cukup yakin itu akan berhasil, sepertinya ini adalah pengelakan brutal pelacakan ketergantungan RPM. Misalnya Anda tidak akan pernah melihat paket saya ketika Anda bertanya whatrequires foo-bar
atau whatrequires beagle
.
UPDATE: Setelah dipikir-pikir, rasa sakit yang mengharuskan orang untuk menginstal di foo-bar
mana mereka mungkin tidak kurang dari rasa sakit menghindari manajemen ketergantungan RPM, setidaknya untuk situasi saya. Jadi, kecuali jika seseorang datang dengan cara yang benar membutuhkan "ini ATAU itu" (yang saya pikir akan menjadi fitur yang bagus di RPM pada umumnya) maka saya berencana untuk meminta hanya foo-bar
dan kemudian, pada saat runtime, jika bar-foo
tersedia saya akan memilih antara mereka sesuai dengan kriteria apa pun yang saya butuhkan.
UPDATE: ide lain, yang juga akan menipu RPM tetapi mungkin membuat keadaan menjadi benar. Mungkin saya bisa, dalam %post
, bermain-main dengan basis data RPM secara langsung. Jadi %pre
bisa melindungi saya dari pemasangan yang tidak valid, dan %post
akan berlaku surut memberitahu RPM bahwa saya memerlukan baik foo-bar
atau bar-foo
atau keduanya, tergantung pada apa yang ada ketika saya menginstal.
Terima kasih atas sarannya!
Provides: foo-bar
, sehingga memenuhi kedua dependensi. Untuk versi rpm yang lebih baru, periksa Boolean Dependencies . Tinggal jauh dari%pre
dan%post
bagian, jangan mencoba untuk mengalahkan sistem .Jawaban:
Ini sekarang dimungkinkan pada RPM 4.13.
https://rpm.org/user_doc/boolean_dependencies.html
Ini bisa sederhana seperti:
Requires: (pkgA >= 3.2 or pkgB)
sumber
Perilaku semacam ini sudah dilakukan oleh beberapa paket, misalnya agen pengiriman surat. Paket- paket virtual tersebut memberikan sistem Anda cara untuk mengetahui apakah kemampuan yang mereka butuhkan sudah disediakan oleh beberapa program lain.
Lihat apakah contoh paket virtual di rpm.org membantu Anda.
sumber
foo-bar
danbar-foo
, dan karena saya tidak mengontrol kemasanfoo-bar
saya tidak bisa hanya membuat mereka berdua menyediakansupport-for-mypackage
. Jika saya mengontrol pengemasan kedua prasyarat alternatif tersebut, maka memang paket virtual yang dibagikan akan menjadi solusi yang bagus.Dua kemungkinan:
Jika bagian dari
foo-bar
danbar-foo
Anda gunakan adalah file umum yang Anda bisaRequire /path/to/file
(saya pikir begitu; pengujian saya terbatas).Situasi Anda mirip dengan dependensi opsional. Cara mereka ditangani adalah memiliki
X-common
paket dan kemudian memilikiX-foo-bar
paket yang membutuhkanfoo-bar
danX-bar-foo
paket yang membutuhkanbar-foo
.sumber
foo-bar
dapat memindahkan file-nya (saya hanya mengontrol dibar-foo
sini). Ketergantungan opsional menarik tetapi tidak cukup apa yang saya butuhkan, karena saya benar-benar membutuhkan salah satufoo-bar
ataubar-foo
; satu-satunya hal yang opsional adalah pilihannya. Terima kasih telah membalas.Require: /usr/bin/python3
Apakah ini akan berhasil bagi Anda untuk memiliki bar-foo paket Anda menyediakan foo-bar paket virtual?
Anda kemudian dapat membuat paket burp-baz Anda membutuhkan foo-bar.
Jika melakukan hal di atas terasa skeezy (mungkin memang demikian), Anda mungkin perlu membuat dua versi RPM Anda, satu tergantung
foo-bar
dan yang lainnya tergantungbar-foo
.sumber
foo-bar
, akan hancur jika ia berpikirbar-foo
memberikan sesuatu yang sebenarnya tidak. Poin penting adalah bahwa untuk paket saya, saya membutuhkan salah satu dari prasyarat tetapi tidak keduanya; tetapi paket lain mungkin benar-benar membutuhkan salah satunya saja. Dan saya tidak bisa hanya meminta keduanya, karena ada kasus nyata di mana hanya satu atau yang lain akan tersedia.Non-determinisme dalam sistem otomatis (yang merupakan manajemen ketergantungan atau mesin yang menggunakan RPM) adalah hal yang sangat buruk. Anda INGIN gagal pada situasi ini-atau-itu, karena gagal masih tidak seburuk hasil yang tidak terduga.
Untuk mengatasi masalah ini, mungkin minta paket yang Anda kontrol% memberikan token utama bahwa paket yang tidak dapat diubah juga terjadi pada% yang disediakan dan yang% bergantung pada perangkat lunak Anda lainnya; kemudian minta paket Anda% obsoletes yang tidak dapat diubah. Terutama jika sudah ada di tempat, Anda mungkin menang atas instalasi lain.
Pengemasan dan ketergantungan yang tepat dan operasi pemasangan adalah pekerjaan yang sulit. Tujuannya - instalasi yang andal, dapat diulang, dan diaudit - sangat berharga sehingga Anda dapat menyadari keuntungan dari melakukan yang benar.
Ketergantungan neraka adalah akibat dari diri sendiri. Tidak ada pengecualian
sumber