Gerenciando dependências em Golang
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, 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 post 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.lock. Alguns 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 adicionar ela no código usando o import e executar novamente o dep ensure que ela será instalada.
O 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.