pattern para instalar dependências no linux

0

Diferentes sistemas operacionais têm diferentes maneiras padrão de instalar dependências de pacotes; no OS X, todas as dependências da biblioteca são copiadas na pasta App .

Os desenvolvedores de aplicativos do Windows têm as duas opções; eles podem instalar uma biblioteca como um subpacote (por exemplo, instaladores de jogos instalariam a biblioteca directX). Mas geralmente o usuário não pode escolher se deseja que as dependências sejam copiadas ou compartilhadas no sistema

No Linux, os gerenciadores de pacotes (por exemplo, apt-get ) resolverão recursivamente as dependências e as instalarão em todo o sistema. Isso, obviamente, não resolve necessariamente o problema de duplicação de dependência, já que os aplicativos ainda podem usar versões ou compilações diferentes da mesma biblioteca de origem

Por exemplo, algumas aplicações requerem libboost-filesystem1.42 mas, porra, eu tenho o libboost-filesystem-1.49 disponível, mas isso não vai ajudar porque o resolvedor de pacotes não consegue descobrir que eu já tenho um.

Por outro lado, não quero que uma biblioteca antiga seja instalada em todos os caminhos do sistema, porque eu já tenho outra versão lá.

Pergunta: existe ou haverá uma opção de gerenciador de pacotes padrão para permitir que dependências de determinados aplicativos sejam instaladas em pastas específicas do aplicativo (como App pastas no Mac OS X)?

    
por lurscher 15.05.2012 / 01:06

1 resposta

4

Você entendeu errado: bibliotecas "antigas" são instaladas em caminhos de todo o sistema, e esse é o comportamento desejável. O modo como funciona é: se duas versões de biblioteca são compatíveis no nível binário, você tem apenas uma instalada e cada aplicativo que usa essa versão usa o mesmo arquivo de biblioteca. Se duas versões da biblioteca não forem compatíveis no nível binário, você terá várias cópias instaladas, cada uma com seu próprio nome, e os aplicativos que requerem diferentes versões da biblioteca usarão o arquivo de biblioteca apropriado.

Por exemplo, se você tiver libboost-filesystem-1.49 instalado (em /usr/lib/libboost_filesystem.so.1.49.0 ), isso não ajuda um aplicativo que requer a versão 1.42.0, porque os binários não são compatíveis. Esse aplicativo requer /usr/lib/libboost_filesystem.so.1.42.0 . Os gerenciadores de pacotes instalarão automaticamente a versão necessária da biblioteca quando você instalar um aplicativo. Se você tiver um aplicativo que requer 1,42 e outro que requer 1,49, você terá duas versões diferentes da biblioteca em /usr/lib , cada uma com seu próprio nome de arquivo, para que possam viver juntas em paz. Atualmente, a maioria dos gerenciadores de pacotes também pode desinstalar automaticamente versões de bibliotecas que não são mais usadas por nenhum aplicativo.

Instalar bibliotecas em diretórios de aplicativos é uma maneira pobre de lidar com dependências, usado em sistemas operacionais que não possuem bons canais de distribuição e gerenciamento de pacotes. Para fazer as coisas funcionarem sem complicações, elas agrupam todas as bibliotecas exigidas por um aplicativo com o próprio aplicativo. Isso significa que você acaba com várias cópias da mesma versão da biblioteca, e não há uma maneira fácil de atualizar bibliotecas - você acaba com várias cópias obsoletas da mesma biblioteca.

Não há e não será uma opção para instalar bibliotecas em diretórios de aplicativos, porque ter um gerenciador de pacotes significa que você não precisa fazer isso.

    
por 15.05.2012 / 01:23