Quando penso nos prós e contras de uma pasta estática da biblioteca e de um gerenciador de pacotes, sinto que a pasta da biblioteca é uma abordagem melhor.
Prós que vejo em uma pasta da biblioteca:
- Não há necessidade de uma ferramenta externa para gerenciar pacotes.
- Não requer conexão com internet para construir.
- Construção mais rápida (sem verificação de pacotes).
- Ambiente mais simples (menos conhecimento necessário).
Prós que vejo com um gerenciador de pacotes:
- Ajuda com árvores de dependência complexas (e que podem ser gerenciadas baixando uma dependência junto com todas as suas dependências).
- Ajuda a verificar se há uma nova versão disponível.
Parece que o setor decidiu seguir o caminho do gerenciador de pacotes para quase tudo o que é construído atualmente. Então, o que estou perdendo?
packages
dependency-management
package-managers
Ignacio Soler Garcia
fonte
fonte
Respostas:
Um ponto importante ausente nas outras respostas:
Usar um gerenciador de pacotes significa ter uma configuração que indica quais versões da biblioteca você está usando e garante que as informações de configuração estejam realmente corretas.
Saber quais bibliotecas você usa e qual versão é muito importante se:
Além disso, quando você realmente atualiza, o gerenciador de pacotes (geralmente) garante que todas as dependências transitivas sejam atualizadas conforme necessário.
Considerando que, com uma
lib
pasta, você só tem um monte de arquivos (possivelmente binários e possivelmente modificados) e precisará adivinhar de onde eles vieram e qual versão eles são (ou confiar em alguns README, que podem ou não estar corretos )Para abordar seus outros pontos:
É verdade, mas a) como desenvolvedor de software, você precisa instalar cargas de ferramentas de qualquer maneira; portanto, mais uma não importa, eb) geralmente existem apenas um ou alguns gerenciadores de pacotes em qualquer campo (Maven / Gradle for Java, npm para JS / TypeScript, etc), por isso não é necessário instalar dezenas deles.
Todos os gerenciadores de pacotes que conheço trabalham off-line, depois de baixar as dependências necessárias (o que pode acontecer logo após o download do próprio projeto).
Provavelmente é verdade, mas parece improvável que a verificação do pacote offline leve uma quantidade significativa de tempo (é só comparar alguns números de versão). Uma verificação online pode demorar um pouco, mas pode ser desativada, se desejado (se estiver ativada por padrão - o Maven, por exemplo, nunca verifica atualizações de versões).
Verdade, mas como explicado acima, uma
lib
pasta também requer conhecimento. Além disso, como explicado acima, você provavelmente trabalhará apenas com alguns gerenciadores de pacotes diferentes, que você já conhece.fonte
Os profissionais da pasta lib desaparecem rapidamente depois que você passa do desenvolvimento em pequena escala para um trabalho maior.
Por exemplo, o "benefício" de não exigir uma ferramenta externa é superado pelo trabalho necessário para gerenciar manualmente suas dependências; portanto, a ferramenta será você (em mais de um sentido do mundo).
Você não precisa de uma conexão com a internet para gerenciar um pacote. Você pode usar repositórios locais.
Uma construção mais rápida pode ser verdadeira, mas dificilmente é algo que deve determinar se você deve usar um gerenciador de pacotes ou não. Afinal, não estamos falando de magnitudes de diferença, e isso também depende da sua configuração. Você pode facilmente criar uma compilação lenta usando um gerenciador de pacotes, mas isso é basicamente sabotagem.
Ambientes mais simples (menos conhecimento necessário)? Mais uma vez, no desenvolvimento em pequena escala, definitivamente, uma possibilidade. Você pode manter o projeto em sua cabeça completamente, até cada uma das poucas bibliotecas que estão sendo usadas. Adicione um script simples de makefile / outro e você terá um pacote completo.
Mas isso não torna os ambientes mais simples, apenas funciona em ambientes simples. No desenvolvimento em larga escala, você ficará feliz por usar ferramentas padrão em vez de soluções personalizadas. Afinal, você só precisa aprender uma vez (e quando o gerenciador de pacotes do dia é substituído pelo novo e interessante, você também precisa aprender).
fonte
blah install libfoo
. E então, multiplique por, digamos, 5 dependências.Você está perdendo muitas das vantagens dos gerenciadores de pacotes.
Você também está exagerando o valor dos seus "benefícios".
"Externo" para quê? Verifico o executável do NuGet nos meus repositórios. É o único binário em que me sinto bem ao fazer o check-in, já que é pequeno e significa que não preciso fazer check-in de outros binários.
O pip não apresenta problemas nessa frente, já que agora está empacotado com o Python e as alterações incompatíveis e reversas são extremamente raras. Você não vai desenvolver código Python sem ter o Python instalado externamente no seu projeto, de qualquer maneira.
Quando alcançam ampla adoção, os gerentes de pacotes tendem a ser muito estáveis. Você não pode fugir sem algum tipo de ferramenta instalada globalmente para a maioria dos projetos, e um único gerenciador de pacotes é um requisito bastante leve. Geralmente, não é muito mais complicado do que ter o tempo de execução do idioma instalado.
Não consigo me conectar ao meu banco de dados sem uma conexão de rede. Se o banco de dados estiver hospedado na Amazon, preciso de uma conexão completa com a Internet. Preciso de uma conexão com a Internet para enviar e receber alterações através do controle de origem; um servidor de compilação também não pode fazer check-out do código para compilar sem algum tipo de conexão de rede. Você não pode enviar ou receber email sem um. Você não pode baixar bibliotecas para colocá-las na sua pasta lib sem uma! O desenvolvimento permanente sem uma conexão à Internet é praticamente inédito. Em alguns casos raros em que é necessário, você pode lidar com isso baixando os pacotes para um local que o gerenciador de pacotes possa consumir. (Eu sei que o NuGet e o pip estão felizes em extrair de uma simples pasta ou unidade de rede; suspeito que a maioria dos outros também possa.)
30 segundos durante a compilação automatizada e 5 segundos durante as compilações de desenvolvedores locais são uma boa opção para os benefícios que descrevi acima. Esses são prazos triviais que geralmente nem valem a pena considerar em comparação com os problemas que os benefícios resolvem.
Uma ferramenta para o gerenciamento de pacotes e nada para o gerenciamento de bibliotecas não é realmente uma comparação justa. Sem a ferramenta, você precisa aprender qualquer processo personalizado que o projeto esteja usandopara gerenciar suas bibliotecas. Isso significa que você nunca tem certeza se o seu conhecimento existente se aplica a qualquer novo projeto que abordar. Você terá que lidar com qualquer abordagem de miscigenação criada por alguém ou criar a sua. Pode ser um diretório que contém todas as bibliotecas ou pode ser algo muito mais estranho. Talvez, para evitar o check-in das bibliotecas, alguém as coloque em uma unidade de rede e o único indicador de versão seja o nome da pasta. Como é isso ou uma instalação global realmente melhor? Por comparação, um gerenciador de pacotes oferece uma convenção limpa que será aplicada à maioria dos projetos que você encontrar.
O tema comum é que eles fornecem consistência, documentação e recursos, não apenas nos projetos, mas também entre eles. Isso simplifica a vida de todos.
fonte
Tendo convertido recentemente nosso produto do uso de bibliotecas baixadas manualmente para o gerenciamento automático de pacotes com o Nuget, posso dizer que o uso de um gerenciador de pacotes traz enormes benefícios.
Nosso produto é implementado em 27 projetos C #, que são relativamente pequenos para os padrões atuais. Algumas de nossas dependências de terceiros têm dezenas de assembléias.
Antes do Nuget, se eu quisesse atualizar todas as nossas dependências para a versão mais recente, teria que:
Com 27 projetos e dezenas de assemblies de dependência, esse processo era muito propenso a erros e poderia levar horas.
Agora que atualizamos o Nuget, tudo foi feito para mim com um único comando.
fonte
Isso é meio inútil, não é? Se eu usar um gerenciador de pacotes, não preciso ter uma pasta lib. Eu também não preciso gerenciar os pacotes sozinho.
Além de não ter hoje uma conexão com a Internet durante o desenvolvimento, é um tanto raro (talvez com exceção de estar em trânsito), um gerenciador de pacotes decente não deve exigir que você tenha a versão mais recente para compilar seu aplicativo. Pode reclamar, mas não há razão para não criar com a versão que já instalou
Esse é um aumento de velocidade bastante marginal, mas você pode argumentar sobre isso.
Atualmente, a maioria dos gerenciadores de pacotes é tão simples que dificilmente vale a pena tentar contorná-los fazendo isso. Existem até clientes visuais, se você quiser. Na verdade, eles escondem grande parte da croft que está acontecendo.
Os gerenciadores de pacotes também permitem que você compartilhe esses pacotes entre diferentes projetos. Se cinco dos meus projetos usam a mesma versão do Boost, não há necessidade de duplicar isso para cada projeto. Isto é especialmente verdade para as complexas árvores de dependência das quais você fala.
Com uma pasta lib, você gerencia pacotes apenas para esse projeto, enquanto um gerenciador de pacotes permite fazer isso em todo o ambiente de desenvolvimento com uma única ferramenta.
fonte
nuget.org
(o modelo padrão deve já esteja configurado dessa maneira).É a diferença entre usar apenas as bibliotecas (diretório lib) e usá-las, mantendo as meta-informações (gerenciador de pacotes) . Essa metinformação diz respeito a números de versão, dependências (transitivas) entre bibliotecas e outras.
As discussões sobre DLL hell, compatibilidade de bibliotecas, sistema de módulos java, OSGi e outros devem ser pelo menos suficientes para convencer alguns de que vale a pena ter alguma forma de gerenciamento de dependências.
Também há o benefício de um repositório compartilhado (local), portanto, vários projetos não precisam manter cópias de bibliotecas importadas. Se alguém tem um projeto com 20 submódulos, alguns desses módulos possuem 40 dependências ímpares.
fonte
Existem alguns casos em que uma pasta lib pode ser necessária, por exemplo, ao lidar com bibliotecas obsoletas (uma versão dela não é mais mantida / disponível), uma versão modificada localmente de uma biblioteca, ...
Mas, para todo o resto, é como o desenvolvedor assumindo o papel de gerenciador de pacotes:
E IMHO, é menos conhecimento necessário, porque você precisa aprender sobre o uso da ferramenta externa, mas menos sobre as bibliotecas (ou seja, dependências).
fonte
Há outro problema não coberto por outras perguntas: compartilhar deps.
Digamos que você tenha dois pacotes criando a mesma biblioteca. Na melhor das hipóteses, não haverá nenhum conflito, mas o mesmo espaço HDD / SSD será usado duas vezes. Na pior das hipóteses, haverá vários conflitos, como versões.
Se você usar o gerenciador de pacotes, ele instalará a biblioteca apenas uma vez (por versão) e já fornecerá o caminho para ela.
PS: é claro, você precisa de vínculo dinâmico (ou função semelhante no seu idioma) para obter esse profissional.
fonte
Um dos principais motivos pelos quais as bibliotecas compartilhadas foram consideradas um item de progresso nos sistemas Unix e Windows da década de 90 foi como eles poderiam diminuir o uso de RAM quando vários programas usando o mesmo conjunto de bibliotecas foram carregados. O espaço do código só precisa ser alocado ONCE por biblioteca e versão exatas dessa biblioteca , o único uso de memória por instância restante é para variáveis estáticas.
Muitos sistemas operacionais implementam bibliotecas compartilhadas de uma maneira que depende de mecanismos como o unix mmap () api - o que implica que uma biblioteca não apenas precisará ter exatamente a mesma versão, mas, na verdade, o mesmo arquivo. É simplesmente impossível tirar o máximo proveito de um programa que envia seu próprio conjunto de bibliotecas.
Dado que a memória é muito mais barata e as versões de bibliotecas precisavam de mais diversidade do que nos anos 90, esse argumento não tem tanto peso atualmente.
fonte