Weiß jemand, wie man eine alternative Anforderung oder einen Satz von Anforderungen in einer Spezifikationsdatei im Gegensatz zu einer einzelnen Anforderung spezifiziert (oder ob man sie spezifizieren kann)?
Angenommen, es sind zwei Pakete mit dem passenden Namen foo-bar
und verfügbar bar-foo
. Mein Paket benötigt eines davon, aber nicht beide, und es ist mir egal, welches vorhanden ist. Zur Laufzeit verwende ich das, was verfügbar ist.
So effektiv möchte ich sagen:
Requires: foo-bar OR bar-foo
Soweit ich das beurteilen kann, ist das nicht möglich, aber ich schätze, es gibt Leute hier, die viel mehr über RPM wissen als ich. Vielleicht gibt es einen Weg, dies zu tun.
UPDATE: Ich kontrolliere nur das Paketieren von bar-foo
, nicht foo-bar
, also funktioniert es nicht , wenn beide ein virtuelles Paket bereitstellen.
UPDATE: Was ich eigentlich brauche, ist selbst ein virtuelles Paket in jedem der Pakete. Say foo-bar provides eagle' and
bar-foo bietet beagle and my package works with either (or both); but other packages require either
eagle or
beagle or
foo-bar or
bar-foo` und das Zielsystem kann entweder eine oder beide installiert.
Derzeit neige ich dazu, dieses Problem mit einem %pre
Skript zu lösen , das etwa folgende Aufgaben erfüllt:
rpm -q eagle || rpm -q beagle || echo "need eagle or beagle" && /bin/false
Ich bin mir zwar ziemlich sicher, dass dies funktionieren würde, aber es scheint eine brutale Umgehung des RPM-Abhängigkeits-Trackings zu sein. Zum Beispiel würden Sie mein Paket nie sehen, wenn Sie whatrequires foo-bar
oder gefragt haben whatrequires beagle
.
UPDATE: foo-bar
Zumindest für meine Situation ist der Schmerz, dass die Benutzer an einem Ort installiert werden müssen, an dem er möglicherweise nicht installiert wird, geringer als der Schmerz, das RPM-Abhängigkeitsmanagement zu umgehen. Wenn also nicht jemand eine Möglichkeit findet, "dieses ODER das" (was meiner Meinung nach eine großartige Funktion im RPM-Bereich ist) richtig zu fordern, plane ich, dies nur zu fordern foo-bar
und dann zur Laufzeit zu bar-foo
wählen , ob es verfügbar ist sie nach welchen Kriterien ich brauche.
UPDATE: eine andere Idee, die auch RPM betrügen würde, aber die Dinge in den richtigen Zustand bringen könnte. Vielleicht könnte ich in der %post
RPM-Datenbank direkt fummeln. So %pre
konnte ich von einem Schutz für ungültig installieren, und %post
würde rückwirkend RPM sagen , dass ich erfordern entweder foo-bar
oder bar-foo
oder beides, je nachdem , was ist da , wenn ich installieren.
Danke für die Vorschläge!
Provides: foo-bar
so zu erstellen , dass beide Abhängigkeiten erfüllt werden. Überprüfen Sie für neuere RPM-Versionen die Booleschen Abhängigkeiten . Halten Sie sich von Abschnitten fern%pre
und versuchen Sie nicht, das System zu zerstören .%post
Antworten:
Dies ist ab RPM 4.13 möglich.
https://rpm.org/user_doc/boolean_dependencies.html
Es kann einfach sein als:
Requires: (pkgA >= 3.2 or pkgB)
quelle
Diese Art von Verhalten wird bereits von mehreren Paketen ausgeführt, beispielsweise von Mail-Transport-Agents. Mit diesen virtuellen Paketen kann Ihr System feststellen, ob eine von ihm benötigte Funktion bereits von einem anderen Programm bereitgestellt wird.
Sehen Sie, ob das Beispiel für virtuelle Pakete in rpm.org Ihnen hilft.
quelle
foo-bar
und benötigenbar-foo
, und da ich die Verpackung von nicht kontrolliere,foo-bar
kann ich sie nicht einfach beide bereitstellen lassensupport-for-mypackage
. Wenn ich das Packen beider alternativer Voraussetzungen kontrollieren würde, wäre ein gemeinsam genutztes virtuelles Paket in der Tat eine großartige Lösung.Zwei Möglichkeiten:
Wenn das Teil
foo-bar
undbar-foo
Sie verwenden eine gemeinsame Datei ist , können Sie nurRequire /path/to/file
(I denke so, meine Prüfung beschränkt war).Ihre Situation ähnelt optionalen Abhängigkeiten. Die Art und Weise, wie sie behandelt werden, besteht darin, ein
X-common
Paket und dann einX-foo-bar
Paket zu haben, das es erfordert,foo-bar
und einX-bar-foo
Paket, das es erfordertbar-foo
.quelle
foo-bar
könnten ihre Dateien verschieben (ich kontrolliere nurbar-foo
hier). Optionale Abhängigkeiten sind interessant, aber nicht ganz das, was ich brauche, da ich entwederfoo-bar
oder wirklich brauchebar-foo
. Das einzige, was optional ist, ist die Auswahl. Danke für die Antwort.Require: /usr/bin/python3
Funktioniert es für Sie, wenn Ihr Paket bar-foo die virtuelle Paket-foo-Leiste bereitstellt?
Sie können dann einfach Ihr Burp-Baz-Paket von der Foo-Bar abhängig machen.
Wenn sich das oben Genannte als schwierig anfühlt (wahrscheinlich), müssen Sie möglicherweise zwei Versionen Ihres RPM erstellen, eine abhängig von
foo-bar
und eine abhängig vonbar-foo
.quelle
foo-bar
, würde dann kaputt gehen, wenn esbar-foo
etwas liefern würde, was es wirklich nicht war. Der Knackpunkt ist, dass ich für mein Paket eine der beiden Voraussetzungen brauche, aber nicht beide; Aber für jedes andere Paket ist möglicherweise nur eines erforderlich. Und ich kann nicht einfach beides verlangen, da es echte Fälle gibt, in denen nur das eine oder andere zur Verfügung steht.Nichtdeterminismus in automatisierten Systemen (das ist entweder das Abhängigkeitsmanagement oder die Maschinen, die RPMs verwenden) ist eine wirklich schlechte Sache. Sie WOLLEN, dass es in dieser oder jener Situation fehlschlägt, da ein Fehlschlagen immer noch nicht so schlimm ist wie ein unerwartetes Ergebnis.
Lassen Sie das von Ihnen kontrollierte Paket% möglicherweise die Haupttoken bereitstellen, die das unveränderliche Paket auch von% bereitstellt und von denen Ihre andere Software% abhängt. dann muss dein paket% das unveränderbare überflüssig machen. Besonders wenn es bereits vorhanden ist, können Sie es gewinnen über die andere Installation.
Packen und ordnungsgemäße Abhängigkeiten und Installationsvorgänge sind eine schwierige Aufgabe. Das Ziel - zuverlässige, wiederholbare und überprüfbare Installationen - ist so wertvoll, dass Sie die Vorteile erkennen, die es mit sich bringt, wenn Sie es richtig machen.
Die Hölle der Abhängigkeit ist selbstverschuldet. Keine Ausnahmen
quelle