Problemas de dependência ao construir software [fechado]

1

Quando eu construo binários a partir de uma fonte fornecida por terceiros, há sempre um problema com as versões de dependências.

Eu principalmente uso Debian (algumas vezes Ubuntu) e os repositórios têm apenas uma ou duas versões principais, então eu não consigo obter a versão que o código requer.

Normalmente, eu faço um dos seguintes procedimentos:

  • Gerencie para obter a versão de que preciso de apt-get (Rare)

  • Altere o sources.list e apenas atualize esse pacote (que parece quebrar outros pacotes e suas dependências)

  • Faça um dist-upgrade (o software que compilei antes de parar, já que as dependências mais antigas estão sendo substituídas pelas mais novas)

  • Tente instalar as dependências sem o aptitude diretamente do site de terceiros

Por exemplo, source requer g++5 , o Debian Jessie tem apenas 4 em seu repositório ou instala uma biblioteca compartilhada como libboost .

Qual é a melhor maneira de gerenciar dependências que não estão disponíveis com a fonte de aptidões de distribuições atuais?

    
por mt025 02.02.2018 / 03:25

1 resposta

2

TL; DR: use /usr/local ou backports e empacote seu próprio software.

Vou começar com uma generalidade: um lançamento de distribuição é uma unidade coerente. Obviamente existe para apoiar o que seus usuários querem fazer em cima disso, dentro da razão (veja o item 4 no contrato social Debian ) , mas primeiro tem que se sustentar; em particular, as bibliotecas que ele contém estão lá principalmente porque são dependências de algum outro software na distribuição, e os -dev packages (ou devel para leitores no lado RPM da cerca) estão lá para que o software empacotado pode ser construído usando a distribuição. Quando você cria softwares sobre uma distribuição, se as bibliotecas incluídas na distribuição atendem aos seus requisitos, isso é ótimo, e você é muito bem-vindo para usá-las. mas se não, você deve evitar massagear a distribuição para atualizá-las.

Alguns ambientes de desenvolvimento já lidam com isso: Python tem seus ambientes virtuais, Ruby tem algo parecido, Java e NPM gerenciam suas próprias árvores de dependência específicas do projeto, etc. O ecossistema C / C ++ não tem nada assim, além de /usr/local , que pode se encaixar em muitos casos, inclusive quando o compilador é muito antigo.

Na prática, no ecossistema C / C ++, existem algumas soluções viáveis.

  • Se você precisar do limite, você pode usar um sistema "instável" para o seu desenvolvimento. Ele não precisa ser o seu sistema completo (você deve fazer isso apenas se estiver confortável ajudando o Debian a desenvolver o próximo lançamento), um chroot funciona muito bem para isso; Observe também que “instável” se refere à estabilidade do ABI, não à estabilidade geral do sistema.

  • Se você estiver confortável gerenciando suas próprias dependências manualmente, crie seu software e suas dependências (que não estão disponíveis na distribuição) em /usr/local (e confira ferramentas como Armazenar para gerenciar versões).

  • Se você precisar apenas de algumas dependências atualizadas, considere usar backports . Esta resposta explicará como instalar os backports e até mesmo construir os seus próprios; Isso permitirá que você continue usando pacotes de maneira segura com versões mais recentes do que as que você pode encontrar na versão estável atual. Isso é bastante escalável e muitas organizações mantêm seus próprios repositórios de pacotes portados internamente.

Acima de tudo, vale a pena aprender a empacotar o software que você está criando: isso significa que as ferramentas da distribuição ajudarão a garantir que as dependências permaneçam disponíveis, o que é muito útil quando você instala o software em outros sistemas e quando atualizar. A excelente técnica pragmática do Debian do Vincent Bernat ajudará você a chegar lá rapidamente.

    
por 02.02.2018 / 09:18