Чи можна вимагати пакет "цей АБО той" у специфікаційному файлі RPM?


30

Хтось знає, як (або чи можна) вказати альтернативну вимогу або набір вимог у специфікаційному файлі на відміну від однієї вимоги?

Наприклад, скажімо, що доступні два пакети, зручно названі foo-barта bar-foo. Мій пакунок вимагає одного з цих, але не обох, і мені все одно, який з них є. Під час виконання я використовую те, що є в наявності.

Настільки ефективно я хотів би сказати:

Requires: foo-bar OR bar-foo

Наскільки я можу сказати, це неможливо, але я вважаю, що тут є люди, які знають про RPM набагато більше, ніж я, тому, можливо, є спосіб це зробити.

ОНОВЛЕННЯ: Я контролюю лише упаковку bar-foo, ні foo-bar, тому надання обох віртуальних пакетів не буде працювати.

ОНОВЛЕННЯ: Те, що мені насправді потрібно, - це сам віртуальний пакет у кожному з пакетів. Скажімо, foo-bar provides eagle' andbar-foo забезпечує бігль- and my package works with either (or both); but other packages require eitherорел orbeagle orfoo-bar orbar-foo`, а в цільовій системі може бути встановлено або обидва, або і те й інше.

На даний момент я схиляюся до вирішення цього питання за допомогою %preсценарію, який робить щось на кшталт:

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

Хоча я впевнений, що це спрацює, це здається жорстоким обходом відстеження залежності RPM. Наприклад , ви б ніколи не бачити мій пакет , коли ви запитали whatrequires foo-barчи whatrequires beagle.

ОНОВЛЕННЯ: По-друге, біль вимагати від людей встановлювати foo-barтам, де вони, можливо, не менший, ніж біль, що обійдеться в управлінні залежністю RPM, принаймні для моєї ситуації. Тож якщо хтось не придумає спосіб належним чином вимагати "цього АБО цього" (що, на мою думку, було б чудовою особливістю мати в RPM взагалі), тоді я планую вимагати лише foo-bar цього, а потім, під час виконання, якщо bar-fooє, я виберу між їх за будь-якими критеріями, які мені потрібні.

ОНОВЛЕННЯ: ще одна ідея, яка також обманює RPM, але може привести речі в потрібний стан. Можливо, я міг би %postбезпосередньо зіткнутися з базою даних RPM. Таким чином, він %preміг би захистити мене від недійсної установки та %postзаднім числом сказати RPM, що мені потрібно або одне, foo-barабо те bar-fooі інше, залежно від того, що там, коли я встановлюю.

Дякую за пропозиції!


Я знаю, що це дуже старе; але чи є для цього хороше рішення? Я роблю RPM, який має java-1.6.0-openjdk в Потрібно: рядок; але з java7; Я також хотів би підтримати java-1.7.0-openjdk, але не міг знайти хороший спосіб помістити будь-яку з цих двох у Потрібно:
vpram86

Якщо ви керуєте упаковкою бар-фу, одне можливе рішення - створити її Provides: foo-bar, щоб вона задовольняла обидві залежності. Щоб отримати новіші версії rpm, перевірте булеві залежності . Тримайтеся подалі від %preі %postділянок, не намагайтеся перемогти систему .
forcefsck

Відповіді:


13

Тепер це можливо з RPM 4.13.

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

Це може бути просто, як: Requires: (pkgA >= 3.2 or pkgB)


з документа, схоже, це не можна використовувати з потребами, правильні лише "слабкі" залежності?
dsollen

Друга посилання показує, що їх можна використовувати з Requires. У першому посиланні згадується, що використовувати його таким чином не дозволяється у Fedora, але це не стосується спеціальних пакетів.
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 / Linux надають різні віртуальні пакети python3: python3, python34, python35 і т. Д. Для того, щоб мій єдиний пакет працював над усіма ними, я зміг просто використовуватиRequire: /usr/bin/python3
bgStack15

0

Чи буде працювати для вас, щоб ваш пакет bar-foo надав віртуальний пакет foo-bar?

Тоді ви можете просто зробити так, щоб ваш пакет відриг-баз вимагав колонтитула.


Якщо ви робите вище, ви відчуваєте себе невимушеним (це, мабуть, так), можливо, вам доведеться створити дві версії RPM, одну в залежності, foo-barа другу в залежності від bar-foo.


Заманливо, але небезпечно: щось інше, що насправді потребує foo-bar, згодом зламається, якби вона думала, що bar-fooзабезпечує щось таке, чого насправді немає. Важливим моментом є те, що для мого пакету мені потрібна одна з передумов, але не обидві; але будь-який інший пакет може дійсно потребувати лише одного з них. І я не можу просто вимагати обох, оскільки є реальні випадки, коли буде доступний лише той чи інший.
Кевін Мороз

-2

Недетермінізм в автоматизованих системах (це або управління залежностями, або машини, які використовують RPM) - це справді погана річ. Ви ХОЧЕТЕ, щоб він не вдався до цієї чи іншої ситуації, оскільки невдача все ще не така вже й погана, як несподіваний результат.

Щоб вирішити проблему, можливо, у пакеті, який ви контролюєте,% надаються основні жетони, від яких також надається незмінний пакет%, і від якого залежить ваше інше програмне забезпечення%; тоді ваш пакунок% застаріває незмінний. Особливо, якщо він вже встановлений, ви можете виграти його над іншою установкою.

Упаковка та належна залежність та операції встановлення - це хитра робота. Мета - надійні, повторювані, перевірені встановлення - настільки цінна, що ви можете усвідомити користь від її правильного.

Пекло залежності залежно від себе. Немає винятків


Ось риба, яку я вам дам: Вам потрібно лише одне з двох, оскільки обидва надають файл чи ресурс. Отже, не залежно від назви пакету, а лише від файлу чи ресурсу, який вони надають. Так, ви все одно будете ухвалювати недетермінізм, але якщо ви насправді розглядаєте можливість спілкуватися безпосередньо з rpmdb, ви вже радісно розглядаєте ризики, які більшість людей навчилися уникати. Я сподіваюся, що ви зможете знайти рішення, яке не несе такої технічної заборгованості.
користувач2066657
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.