Alguém sabe como (ou se pode) especificar um requisito alternativo ou conjunto de requisitos em um arquivo de especificação, em oposição a um único requisito?
Por exemplo, diga que existem dois pacotes disponíveis, convenientemente nomeados foo-bar
e bar-foo
. Meu pacote exige um desses, mas não ambos, e não me importo com qual deles esteja presente. Em tempo de execução, uso o que estiver disponível.
Tão eficazmente, eu gostaria de uma maneira de dizer:
Requires: foo-bar OR bar-foo
Até onde eu sei, isso não é possível, mas acho que há pessoas aqui que sabem muito mais sobre RPM do que eu, então talvez haja uma maneira de fazê-lo.
ATUALIZAÇÃO: Eu apenas controlo o empacotamento bar-foo
, não foo-bar
, portanto, ter ambos fornecendo um pacote virtual não funcionará.
ATUALIZAÇÃO: O que eu realmente preciso é um pacote virtual dentro de cada um dos pacotes. Digamos foo-bar provides eagle' and
barra-foo fornece beagle and my package works with either (or both); but other packages require either
águia or
beagle or
foo-bar or
bar-foo`, e o sistema de destino pode ter um ou ambos instalados.
Atualmente, estou inclinado a resolver isso com um %pre
script que faz algo como:
rpm -q eagle || rpm -q beagle || echo "need eagle or beagle" && /bin/false
Embora tenha certeza de que funcionaria, parece uma brutal evasão ao rastreamento de dependências do RPM. Por exemplo, você nunca veria meu pacote quando pedisse whatrequires foo-bar
ou whatrequires beagle
.
ATUALIZAÇÃO: Pensando bem, a dor de exigir que as pessoas instalem foo-bar
onde elas não podem é menor que a dor de contornar o gerenciamento de dependências de RPM, pelo menos para a minha situação. Portanto, a menos que alguém encontre uma maneira de exigir adequadamente "isto ou aquilo" (o que eu acho que seria um ótimo recurso para o RPM em geral), planejo exigir apenas foo-bar
e, em tempo de execução, se bar-foo
estiver disponível, vou escolher entre de acordo com os critérios que eu precisar.
UPDATE: outra idéia, que também estaria enganando o RPM, mas poderia colocar as coisas no estado certo. Talvez eu pudesse %post
mexer diretamente com o banco de dados do RPM. Assim %pre
poderia me proteger de um inválido instalar, e %post
teria efeitos retroactivos dizer RPM que eu exigir quer foo-bar
ou bar-foo
ou ambos, dependendo do que está lá quando eu instalar.
Obrigado pelas sugestões!
Provides: foo-bar
, para satisfazer as duas dependências. Para versões mais recentes do rpm, verifique Dependências booleanas . Fique longe de seções%pre
e não tente derrotar o sistema .%post
Respostas:
Agora isso é possível a partir do RPM 4.13.
https://rpm.org/user_doc/boolean_dependencies.html
Pode ser simples como:
Requires: (pkgA >= 3.2 or pkgB)
fonte
Esse tipo de comportamento já é feito por vários pacotes, por exemplo, agentes de transporte de correio. Esses pacotes virtuais fornecem ao seu sistema uma maneira de saber se um recurso que eles precisam já foi fornecido por algum outro programa.
Veja se o exemplo de pacotes virtuais no rpm.org ajuda você.
fonte
foo-bar
ebar-foo
, e como não controle a embalagem,foo-bar
não posso apenas fazê-los fornecersupport-for-mypackage
. Se eu controlasse o empacotamento de ambos os pré-requisitos alternativos, um pacote virtual compartilhado seria uma ótima solução.Duas possibilidades:
Se a parte de
foo-bar
ebar-foo
você usar for um arquivo comum, você pode apenasRequire /path/to/file
( acho que sim; meus testes foram limitados).Sua situação é semelhante às dependências opcionais. A maneira como eles são tratados é ter um
X-common
pacote e, em seguida, umX-foo-bar
pacote que requerfoo-bar
e umX-bar-foo
pacote que requerbar-foo
.fonte
foo-bar
poderia mover seus arquivos (eu só controlobar-foo
aqui). Dependências opcionais são interessantes, mas não exatamente o que eu preciso, pois eu realmente preciso de umfoo-bar
oubar-foo
; a única coisa opcional é a escolha de qual. Obrigado por responder.Require: /usr/bin/python3
Será que vai funcionar para que o seu pacote bar-foo forneça o pacote virtual foo-bar?
Você pode fazer o seu pacote burp-baz exigir foo-bar.
Se o procedimento acima parecer esquisito (provavelmente é), você poderá criar duas versões do seu RPM, uma dependendo
foo-bar
e a outra dependendobar-foo
.fonte
foo-bar
, se romperia se pensassebar-foo
estar fornecendo algo que realmente não era. O ponto principal é que, para o meu pacote, preciso de um dos pré-requisitos, mas não de ambos; mas qualquer outro pacote pode realmente precisar de apenas um deles. E também não posso exigir os dois, pois há casos reais em que apenas um ou outro estará disponível.Não-determinismo em sistemas automatizados (que é o gerenciamento de dependências ou as máquinas que usam RPMs) é uma coisa muito ruim. Você QUER fracassar em uma situação como essa ou aquilo, pois a falha ainda não é tão ruim quanto um resultado inesperado.
Para resolver o problema, talvez o pacote que você controla% forneça os principais tokens que o pacote imutável também fornece% e de que% o seu outro software depende; então, seu pacote% obsoleta o imutável. Especialmente se ele já estiver no lugar, você poderá vencê-lo na outra instalação.
Empacotar e dependência adequada e operações de instalação é um trabalho complicado. O objetivo - instalações confiáveis, repetíveis e auditáveis - é tão valioso que você pode perceber os ganhos de fazê-lo corretamente.
O inferno da dependência é auto-infligido. Sem exceções
fonte