Estou curioso para entender como ~
é processado em uma dependência pelo Apt ou como é definido para arquivos deb (não tenho certeza exatamente onde a sintaxe é definida).
Eu o encontrei em relação às dependências do metapacote Ubuntu (Focal) python3
que tem a restrição de dependência: python3.8 >= 3.8.2-1~
(veja aqui ).
Eu acredito que as versões do pacote são definidas para que eles classifiquem lexicalmente em ordem, mas quando eu verifiquei o ubuntu focal, não há uma versão python3.8
que classifique lexicalmente >=
3.8.2-1~
, mas há uma versão 3.8.10-0ubuntu1~20.04.4
inferindo que as dependências do Ubuntu Focal estão quebradas ( não são ) ou há algum significado especial para ~
uma dependência.
A única documentação que posso encontrar sobre o tópico é Debian's Declaring relations between packages . Mas isso não menciona a ~
ou correspondência de padrões.
Então, qual é o significado do trailing ~
em uma dependência .deb?
A documentação sobre os
Version
estados de campo de controle (veja a página para o algoritmo completo):Uma nota de rodapé adiciona isso sobre o til:
Os tils nas versões estão descritos na seção Política de versões . Basicamente, os tils são classificados antes de qualquer coisa.
Assim
>= 3.8.2-1~
, é satisfeito por qualquer versão começando com3.8.2-1
, incluindo versões com sufixos começando com um til, como3.8.2-1~bpo
(como seria usado para backports), desde que não haja dois tils seguidos. Na verdade, tais dependências, com um til no final da versão (incluindo a revisão do Debian), são normalmente usadas para facilitar backports.Já que isso é especificamente sobre o que sua pergunta trata, e não é abordada pela Política Debian, vale a pena entrar em mais detalhes. Uma dependência de versão típica seria semelhante a
python3.8 >= 3.8.2-1
, exigindo a versão 3.8.2-1 ou posterior dopython3.8
pacote. Isso seria satisfatível por qualquer versão upstream posterior do Python 3.8, e qualquer revisão Debian posterior do pacote (3.8.2-2, ou 3.8.2-1ubuntu1, etc.). Mas não seria satisfeito por backports, que possuem versões da forma 3.8.2-1~bpo10+1; como o til classifica antes da string vazia, 3.8.2-1~bpo10+1 é considerado menor que 3.8.2-1. Backporting de pacotes usando dependências versionadas desta forma requer a mudança de suas dependências, o que vai contra a regra geral de que backports devem ser o mais próximo possível do pacote original.Portanto, adicionar um til como o último caractere de uma versão em uma dependência com versão ajuda a relaxar um pouco a dependência: permite que versões com o mesmo prefixo e um sufixo separado por til satisfaçam a dependência com versão. Isso é o oposto do uso documentado de tils para pré-lançamentos , que resulta em versões que não podem satisfazer dependências estritamente versionadas na versão final.
(Observe que um til como o último caractere em um número de versão que inclui uma revisão do Debian, conforme fornecido na pergunta, não pode permitir pré-lançamentos upstream - eles se pareceriam com 3.8.2~pre1-1, que é menor que 3.8.2-1~.)
As versões não são classificadas lexicalmente, elas são classificadas por componente, numericamente se possível, lexicalmente caso contrário. Assim, 3.8.10-0ubuntu1~20.04.4 satisfaz esta relação: 10 é maior que 2, então a dependência é satisfeita e a comparação para por aí.