O que é o inferno de dependências e como utilizar o Dependabot
Provavelmente, toda pessoa desenvolvedora, quando confrontada com um problema complicado, já pensou empolgadamente: “Aposto que existe uma biblioteca que eu posso utilizar para resolver isso!”. O pensamento não está errado, pois traz consigo a promessa de economia de tempo, complexidade abstraída e eficiência adquirida. Entretanto, esse pensamento, se utilizado de maneira excessiva, pode acarretar em vários problemas, como o inferno de dependências.
Enfrentou ou está enfrentando o inferno de dependências e está buscando uma forma automática de atualizar as dependências do seu projeto?
Neste artigo, vamos falar sobre o inferno de dependências e como enfrentá-lo utilizando o Dependabot. Descobriremos como utilizá-lo em repositórios do GitHub e o quanto ele facilita a vida das pessoas desenvolvedoras.
O que é inferno de dependências?
O inferno de dependências é um termo utilizado para definir os problemas enfrentados pelas pessoas desenvolvedoras, quando o software - ou um pacote de software - depende de terceiro e não consegue acessar essa dependência adicional para funcionar corretamente. Resumindo: quando o software funciona de forma anormal, exibindo erros e bugs devido a um software/aplicativo integrado no sistema que foi desenvolvido por terceiros, temos o inferno de dependências!
O problema pode assumir muitas formas e ocorrer por várias causas, como, por exemplo, a necessidade de instalar bibliotecas de software complementares, a necessidade de longas cadeias de instalações, problemas com um programa conflitante, a criação de dependências circulares, dependências desatualizadas que são mantidas no projeto e muito mais.
Causas do inferno de dependências
Como dito acima, a causa do inferno de dependências é variada, mas geralmente ocorre por uma das cinco razões:
- Quando o software principal depende de uma infinidade de grandes bibliotecas de software, causando downloads demorados e diminuindo a portabilidade do software. Importante ressaltar que mesmo quando apenas uma pequena funcionalidade da biblioteca for utilizada, toda a biblioteca será baixada;
- Quando o software principal cria uma cadeia de dependências, onde o software depende da biblioteca A, mas a A depende da biblioteca B para funcionar e a B precisa da biblioteca C para funcionar corretamente. Isso causa uma cadeia que possui grande potencial para gerar conflitos;
- Quando no software principal existem bibliotecas conflitantes que exigem diferentes versões de bibliotecas para funcionar, como por exemplo: um software Z que requer os softwares XX e YY para funcionar, e o software XX requer a versão 2.0 do software AA, enquanto o software YY requer a versão 2.5 do software AA, só que ambas as versões do software AA não podem ser instaladas ao mesmo tempo, pois causam conflito;
- Quando o software principal cria dependências circulares. Exemplo: O software A 1.0 depende do software B 2.0 para funcionar, e o software B 2.0 depende do software C 2.0, e o software C 2.0 depende do software A 1.0, ou seja, qualquer atualização de versão destes softwares causaria um grande problema;
- Quando o software possui dependências desatualizadas em seu arquivo fonte.
Dependências podem ser uma grande dor de cabeça para pessoas desenvolvedoras e para usuários. Entretanto, existem ferramentas e técnicas que aliviam e auxiliam na prevenção desses problemas. Vamos conhecê-las?
Dicas para evitar o inferno de dependências
A boa notícia é que, apesar das dependências serem inevitáveis na maioria das situações e projetos, existem maneiras de diminuir o risco de um potencial inferno de dependências. Algumas ações que podem ser realizadas, são:
Especificar quais dependências devem ser priorizadas em relação a outras
Um dos primeiros e mais importantes passos é decidir quais bibliotecas precisam ser atualizadas primeiro. Uma maneira de realizar essa decisão é classificar as dependências de acordo com a importância delas para o funcionamento ideal do seu software. Os mais críticos são os mais importantes para você atualizar e dar atenção.
Remover dependências não utilizadas
No lugar de acumular dependências adicionais, tente remover as não utilizadas como seu ponto de partida. Existe também a possibilidade de utilizar ferramentas de análise de código estático para descobrir onde suas dependências menos importantes se originam e você pode comprimi-las ou se livrar delas completamente.
Outra abordagem valiosa é importar de pacotes apenas o que você precisa. Isso implica diretamente na leveza do código e reduz consideravelmente a chance de colisões ou conflitos.
Automatizar as atualizações de dependências de software
As atualizações de dependências são uma parte importantíssima para manter os softwares atualizados com aprimoramentos que podem melhorar o desempenho, a segurança e até mesmo adicionar novas funcionalidades. Ao não se manter atualizado com atualizações e refinamentos importantes, você pode cair facilmente no inferno de dependências, que poderia ter sido mitigado sem muito esforço.
A automação é uma maneira de garantir que você se beneficie de atualizações cruciais assim que elas estiverem disponíveis. Uma ferramenta muito conhecida por realizar essa automação de atualização de dependências de projetos é o Dependabot, que iremos abordá-lo mais adiante neste artigo.
Criar (e manter) uma política de gerenciamento de dependência de software
Em um time, para garantir que todas as pessoas desenvolvedoras sigam todos os itens acima, bem como quaisquer outras medidas importantes, certifique-se de estabelecer diretrizes claras de gerenciamento de dependência. Além disso, ter uma política em vigor é crucial para monitorar a segurança, melhorar o desempenho dos softwares e fornecer garantia de qualidade.
O Dependabot
Manter as dependências atualizadas é uma das maneiras mais fáceis de manter o software que você cria seguro. No entanto, atualizar dependências de forma manual não é uma tarefa fácil, considerada pela maioria das pessoas desenvolvedoras uma tarefa árdua. O Dependabot nos ajuda justamente nisso, atualizando dependências automaticamente, para que você possa gastar menos tempo atualizando dependências e mais tempo construindo software.
Tendo sido adquirido pelo GitHub, o Dependabot está disponível de forma nativa e gratuita, e certamente é uma ferramenta que vale muito a pena utilizar se você estiver procurando por uma abordagem mais fácil para manter as dependências atualizadas nos seus projetos.
O Dependabot possui suporte para automatizar a atualização de dependências em Ruby, JavaScript, Python, PHP, Elixir, Elm, Go, Rust, Java e .Net. Ele também pode atualizar submódulos git, arquivos Docker e arquivos Terraform.
Como o Dependabot funciona?
Ele verifica se há requisitos desatualizados ou inseguros em seus arquivos de dependência. Se encontrar alguma dependência desatualizada ou insegura, ele alerta automaticamente o proprietário do repositório/projeto por meio de uma notificação do GitHub, bem como um e-mail. Ele cria um pull request individual para cada atualização, você pode verificar e aprovar manualmente a alteração e mesclar a solicitação pull, importante ressaltar que também é possível rejeitar a solicitação.
Tutorial de como utilizar o Dependabot em um repositório do GitHub
Para adicionar o Dependabot em seu repositório e aproveitar todos os benefícios desta ferramenta, você terá que seguir os seguintes passos:
1) Ter o Git instalado em sua máquina e ter um repositório no GitHub. Caso precise de ajuda com isso, mais abaixo terão links que te auxiliarão;
2) Na raiz do seu projeto crie uma pasta chamada “.github”;
3) Após a criação da pasta, dentro dela, crie um arquivo chamado “dependabot.yml”;
4) Feito isso, é hora de adicionar as configurações do Dependabot dentro do arquivo. Para isso, vou supor que estou trabalhando em um projeto com JavaScript, ao qual estou utilizando o npm como gerenciador de pacotes e quero buscar atualizações de dependências todos os dias. A configuração do Dependabot ficará assim:
Configuração inserida no arquivo:
version: 2
updates:
- package-ecosystem: npm
directory: "/"
schedule:
interval: daily
Na documentação oficial você encontrará como utilizar outros gerenciadores de pacotes e outros tipos de intervalos de busca de atualizações.
5) Com toda a configuração inserida no arquivo, você já poderá realizar um git commit e posteriormente um git push das alterações feitas. Feito isso, o Dependabot estará oficialmente inserido em seu repositório, pronto para buscar atualizações para suas dependências.
Agora, sempre que alguma dependência ficar desatualizada, o Dependabot irá fazer as alterações necessárias e irá criar um pull request, que você poderá aprovar ou rejeitar manualmente.
Conclusão
Nesse artigo, conhecemos o conceito de inferno de dependências, os problemas que o causam e dicas de como evitá-lo. Vimos também o que é o Dependabot e como utilizá-lo em repositórios do GitHub para aproveitar todos os seus benefícios e atualizar nossas dependências automaticamente para evitar possíveis problemas.
Todos sabemos que o uso de dependências sempre fará parte do desenvolvimento de software. Então se você deseja manter todas as suas dependências atualizadas e evitar o uso de dependências vulneráveis, não pense duas vezes e opte pelo Dependabot, que é muito seguro e nativo do GitHub.
E aí, o que você achou? Não deixe de conferir nossos cursos e continue mergulhando em tecnologia!