Quelqu'un sait-il comment (ou si l'on peut) spécifier une autre exigence ou un ensemble d'exigences dans un fichier de spécifications, par opposition à une seule exigence?
Par exemple, supposons qu'il existe deux packages disponibles, nommés foo-bar
et bar-foo
. Mon colis nécessite l'un d'eux, mais pas les deux, et je me fiche de savoir lequel est présent. Au moment de l'exécution, j'utilise celui qui est disponible.
Donc, effectivement, je voudrais une façon de dire:
Requires: foo-bar OR bar-foo
Pour autant que je sache, ce n'est pas possible, mais je pense qu'il y a des gens ici qui en savent beaucoup plus sur RPM que moi, alors peut-être qu'il y a un moyen de le faire.
MISE À JOUR: Je contrôle uniquement l'empaquetage de bar-foo
, non foo-bar
, donc les deux fournissent un paquet virtuel ne fonctionnera pas.
MISE À JOUR: La chose dont j'ai réellement besoin est en soi un paquet virtuel à l'intérieur de chacun des paquets. Supposons que foo-bar provides eagle' and
bar-foo fournit beagle and my package works with either (or both); but other packages require either
eagle or
beagle or
foo-bar or
bar-foo`, et le système cible peut avoir l'un ou les deux installés.
Je suis actuellement en train de résoudre ce problème avec un %pre
script qui fait quelque chose comme:
rpm -q eagle || rpm -q beagle || echo "need eagle or beagle" && /bin/false
Bien que je sois presque sûr que cela fonctionnerait, cela semble être un contournement brutal du suivi des dépendances de RPM. Par exemple, vous ne verriez jamais mon colis lorsque vous avez demandé whatrequires foo-bar
ou whatrequires beagle
.
MISE À JOUR: À la réflexion, la douleur d'exiger que les gens installent foo-bar
là où ils pourraient ne pas être moins que la douleur de contourner la gestion des dépendances RPM, au moins pour ma situation. Donc, à moins que quelqu'un ne trouve un moyen d'exiger correctement "ceci OU cela" (ce qui, à mon avis, serait une excellente fonctionnalité dans RPM en général), je prévois d'exiger uniquement foo-bar
, puis, au moment de l'exécution, s'il bar-foo
est disponible, je choisirai entre les selon tous les critères dont j'ai besoin.
MISE À JOUR: une autre idée, qui tricherait également RPM mais pourrait mettre les choses dans le bon état. Je pourrais peut-être, %post
directement, jouer avec la base de données de RPM. Ainsi %pre
pourrait me protéger contre une défaillance de l' installation, et %post
serait rétroactivement dire RPM que je requiers soit foo-bar
ou bar-foo
ou les deux, selon ce qui est là quand j'installation.
Merci pour les suggestions!
Provides: foo-bar
, donc il satisfait les deux dépendances. Pour les versions rpm plus récentes, vérifiez les dépendances booléennes . Éloignez -vous%pre
et%post
sections, ne pas essayer de vaincre le système .Réponses:
Cela est désormais possible à partir du RPM 4.13.
https://rpm.org/user_doc/boolean_dependencies.html
Cela peut être simple:
Requires: (pkgA >= 3.2 or pkgB)
la source
Ce type de comportement est déjà effectué par plusieurs packages, par exemple les agents de transport de courrier. Ces packages virtuels fournissent à votre système un moyen de savoir si une capacité dont il a besoin est déjà fournie par un autre programme.
Voyez si l' exemple de packages virtuels dans rpm.org vous aide.
la source
foo-bar
etbar-foo
, et comme je ne contrôle pas l'emballage de,foo-bar
je ne peux pas simplement les faire fournirsupport-for-mypackage
. Si je contrôlais le conditionnement des deux prérequis alternatifs, un package virtuel partagé serait en effet une excellente solution.Deux possibilités:
Si la partie de
foo-bar
et quebar-foo
vous utilisez est un fichier commun, vous pouvez simplementRequire /path/to/file
(je pense que oui; mes tests étaient limités).Votre situation est similaire aux dépendances facultatives. La façon dont ils sont gérés consiste à avoir un
X-common
package, puis unX-foo-bar
package qui requiertfoo-bar
et unX-bar-foo
package qui nécessitebar-foo
.la source
foo-bar
pourrait déplacer ses fichiers (je ne contrôle quebar-foo
ici). Les dépendances optionnelles sont intéressantes mais pas tout à fait ce dont j'ai besoin, car j'ai vraiment besoin de l' unfoo-bar
ou l' autrebar-foo
; la seule chose facultative est le choix de laquelle. Merci d'avoir répondu.Require: /usr/bin/python3
Est-ce que cela fonctionnera pour que votre paquet bar-foo fournisse le paquet virtuel foo-bar?
Vous pouvez alors simplement faire en sorte que votre paquet burp-baz nécessite foo-bar.
Si faire ce qui précède semble effrayant (c'est probablement le cas), vous devrez peut-être créer deux versions de votre RPM, l'une en fonction de
foo-bar
et l'autre en fonction debar-foo
.la source
foo-bar
, se briserait alors s'il pensaitbar-foo
fournir quelque chose qu'il n'était vraiment pas. Le point est que pour coller mon paquet que je besoin soit des conditions préalables mais pas les deux; mais tout autre paquet pourrait vraiment avoir besoin d'un seul d'entre eux. Et je ne peux pas simplement exiger les deux, car il existe de vrais cas où l'un ou l'autre sera disponible.Le non-déterminisme dans les systèmes automatisés (c'est-à-dire la gestion des dépendances ou les machines qui utilisent les RPM) est une très mauvaise chose. Vous VOULEZ qu'il échoue dans telle ou telle situation, car l'échec n'est toujours pas aussi mauvais qu'un résultat inattendu.
Pour résoudre le problème, peut-être que le package que vous contrôlez% fournit les principaux jetons que le package immuable fournit également% et dont dépendent vos autres logiciels%; alors votre package% obsolète l'immuable. Surtout s'il est déjà en place, vous pouvez le faire gagner sur l'autre installation.
L'empaquetage et les opérations de dépendance et d'installation appropriées sont des tâches délicates. L'objectif - des installations fiables, reproductibles et vérifiables - est si précieux que vous pouvez réaliser les avantages de bien faire les choses.
L'enfer de la dépendance est auto-infligé. Aucune exception
la source