Entenda o que são os arquivos go.mod e go.sum

Se você já trabalhou ou conhece um pouco de outras linguagens, podemos comprar o arquivo go.mod ao package.json do JS, composer.json do PHP ou requirements.txt do Python.

Ou seja, o arquivo go.mod, nada mais é do que o arquivo onde o Go vai gerenciar a lista de pacotes que sua aplicação precisa para funcionar.

Além das dependências, é nesse arquivo onde o Go adiciona o nome do seu package e a versão do Go que estava sendo utilizada no momento da criação do projeto.

Essa segunda informação é muito valiosa, pois com base nela o Go vai saber quais versões das dependências externas ele pode ou não utilizar.

Para iniciar um novo go.mod, você precisa executar o seguinte comando:

$ go mod init [NOME-DO-SEU-PACKAGE]

Agora imagine que no lugar do [NOME-DO-SEU-PACKAGE] colocamos github.com/aprendagolang/exemplo e que a versão do Go que temos instalada na máquina seja a 1.16. Após executar o comando, um arquivo parecido com isso será gerado:

Com nosso go.mod inicializado, vamos escrever uma pequena API utilizado go framework GoFiber.

package main

import (
    "fmt"

    "github.com/gofiber/fiber/v2"
)

func main() {
    app := fiber.New()

    app.Get("/:name", HelloHandler)

    app.Listen(":3000")
}

func HelloHandler(c *fiber.Ctx) error {
    return c.JSON(fiber.Map{
        "message": fmt.Sprintf("Hello, %s!", c.Params("name")),
    })
}

Se você der uma olhada no arquivo go.mod, verá que nada mudou. Isso por que ainda não pedimos para o Go verificar as dependências do nosso projeto.

Para fazer isso, precisamos executar o comando go mod tidy. Ao final da execução, uma nova sessão deve ter sido adicionada ao arquivo go.mod, deixando-o parecido com isso.

Além dessa mudança no go.mod, um novo arquivo foi gerado, o go.sum. Esse arquivo é responsável por manter todas as informações para checksum das dependências utilizadas no projeto.

Um projeto simples como esse, na minha máquina, gerou o seguinte go.sum.

Isso por que ele não guarda somente o checksum dos packages que instalamos diretamente, mas o que foram instalados indiretamente também, com por exemplo o github.com/valyala/fasthttp que é um dependência do github.com/gofiber/fiber/v2.

Todos esses packages que o Go referenciou no go.sum foram adicionados ao seu diretório $GOPATH/pkg/mod. Com esse cache em mãos, o Go não precisa fazer download das dependências toda vez que você executar o projeto.

Lembrando que esse cache é global, ou seja, serão compartilhados por todos os projetos que você tiver ou criar na sua máquina.

Caso você queira manter suas dependências dentro do seu projeto, você pode executar o comando go mod vendor, o que nesse caso deve gerar uma nova pasta chamada vendor parecida com isso.

Eu particularmente não gosto muito de fazer isso, mas em alguns casos muito específicos deve fazer sentido.

Para encerrar, em alguns arquivos go.mod você pode encontrar uma sessão chamada “replace”.

Essa sessão é utilizada para informar ao Go que o package github.com/aprendagolang/meu-mod que deve ser utilizado nesse projeto se encontra na pasta ../meu-mod e não na $GOPATH/pkg/mod.

Esse sessão é muito utilizada em projetos que utilizam múltiplos packages mantidos pelo mesmo time ou empresa.

No entanto, a partir da versão 1.18 do Go, essa sessão pode ser substituída pelo go workspace. Se você quiser saber mais, vou deixar aqui o link para o post e vídeo onde explico como utilizar essa nova feature do Go.

Deixem suas dúvidas nos comentários.

Até a próxima!


Subscreva

Fique por dentro de tudo o que acontece no mundo Go.

Deixe uma resposta