Gerenciando Dependências em Golang
Jul 27, 2017 00:00 · 500 words · 3 minute read
by Elton Minetto
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.
Originally published at http://eltonminetto.net/post/2017-07-28-gerenciando-dependencias-golang/ on July 28, 2017.