Back-End

7 ago, 2017

Gerenciando dependências em Golang

Publicidade

Desenvolver software atualmente se parece cada vez mais com montar um quebra-cabeça. Foi-se o tempo dos grandes frameworks, com várias funcionalidades acopladas, e é muito comum usarmos vários pequenos pacotes para montarmos nossos projetos.

A maioria das linguagens de programação modernas possui um sistema de gerenciamento destas dependências, como o Composer do PHP, o yarn/npm para JavaScript, o pip no Python etc. No ecossistema Go, existem várias implementações deste conceito, o que acabou gerando um certo conflito na hora de selecionar uma solução. Para resolver isso, a comunidade começou a desenvolver uma ferramenta para ser o padrão das próximas versões da linguagem.

Esta ferramenta é o dep, que está em acelerado desenvolvimento. Apesar de ainda não estar pronto, ele já pode ser considerado “safe for production use”, segundo o site oficial.

Neste artigo, vou mostrar como usá-lo em um projeto já existente. O primeiro que eu desenvolvi em Go.

O primeiro passo é instalar a ferramenta, usando o comando:

go get -u github.com/golang/dep/cmd/dep

Depois, basta entrar no projeto e executar o comando:

cd goCep dep init

A saída do comando foi:

Using ^1.4.0 as constraint for direct dep github.com/gorilla/mux 
Locking in v1.4.0 (bcd8bc7) for direct dep github.com/gorilla/mux 
Locking in v1.1 (1ea2538) for transitive dep 
github.com/gorilla/context Using master as constraint for direct dep 
github.com/andelf/go-curl Locking in master (f8b334d) for direct dep 
github.com/andelf/go-curl Using master as constraint for direct dep 
github.com/ryanuber/go-filecache Locking in master (52ce07f) for 
direct dep github.com/ryanuber/go-filecache

O que o dep fez foi analisar os meus arquivos .go procurando pelos import e ao, encontrá-lo, ele fez os seguintes passos:

  • criou um diretório chamado vendor;
  • fez o go get de cada dependência salvando os arquivos no vendor;
  • criou um arquivo chamado Gopkg.toml com as definições das dependências;
  • criou um arquivo chamado Gopkg.lock com os detalhes das versões instaladas, incluindo o commit específico que está sendo usado de cada dependência.

Para quem está usando o Composer do PHP, vai reconhecer alguns destes passos, pois o resultado é parecido com o composer.json e composer.lock.

Agora, basta salvar no repositório os arquivos Gopkg.toml e Gopkg.lockAlguns projetos defendem a ideia de salvar no repositório o diretório vendor para facilitar a compilação, mas eu não acho uma alternativa muito válida. Prefiro salvar apenas os arquivos das definições das dependências e não o código delas.

Para instalar as dependências novamente, basta ter o dep instalado e executar:

dep ensure

Quando uma nova dependência for necessária no projeto, basta adicioná-la no código usando o import e executar novamente o dep ensure que ela será instalada.

dep possui mais algumas funcionalidades que podem ser vistas no site oficial, como compatibilidade com outros gerenciadores (Glide por exemplo), atualização das dependências, configurações do arquivo .toml etc.

O plano é a ferramenta ser incluída por padrão em todas as instalações da linguagem a partir da versão 1.10, o que vai facilitar ainda mais o uso no dia a dia. Sem dúvida vai ser uma ótima adição a linguagem.