Go + hot reload

Bruno Gomes - Feb 23 - - Dev Community

Esse post é uma dica rápida para ajudar o desenvolvimento de aplicações Go ficar mais dinâmico e rápido.

Contexto

Go é uma linguagem compilada, qualquer alteração no código da sua aplicação exige que você re-compile e execute novamente.
Isso por si, não é um grande problema, pois a compilação e startup do Go é super rápido e provavelmente sua IDE tem um botão pronto para restart da aplicação.
Porém é um pouco inconveniente, e nos tira algum tempo lembrar de restartar, automatizar esse processo nos deixa mais produtivos.

Ferramenta Reflex

O reflex é uma ferramenta open source escrita em Go, ela basicamente faz watch de um diretório e quando identifica alteração de arquivos re-executa um comando.

Exemplo de uso

Instale o reflex:

go install github.com/cespare/reflex@v0.3.1
Enter fullscreen mode Exit fullscreen mode

Execute o reflex:

reflex -s -r '\.go$$' -- go run .
Enter fullscreen mode Exit fullscreen mode

Simples assim, nesse comando eu estou passando a flag -s para sinalizar que é um processo de longa duração e a flag -r para filtrar somente os arquivos .go.

Log de exemplo:

reflex -s -r '\.go$' -- go run .
[00] Starting service
[00] [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
[00]  - using env:      export GIN_MODE=release
[00]  - using code:     gin.SetMode(gin.ReleaseMode)
[00] 
[00] 2024/02/23 09:12:50 Failed to connect to rabbit  dial tcp [::1]:5672: connect: connection refused
[00] 2024/02/23 09:12:50 Skipping queue setup 
[00] [GIN-debug] POST   /endpoints/               --> api/api.Handler.PostEndpoints-fm (1 handlers)
[00] [GIN-debug] GET    /endpoints/               --> api/api.Handler.GetEndpoints-fm (1 handlers)
...
[00] [GIN-debug] Listening and serving HTTP on :3000

Enter fullscreen mode Exit fullscreen mode

Para mais informações de como usar o reflex, consulte o repositório no github: https://github.com/cespare/reflex

Usando Makefile

O seu comando reflex pode acabar aumentando de acordo com as configurações do seu projeto. Para não precisar ficar digitando ele várias vezes, você pode utilizar um arquivo Makefile no seu projeto, assim por exemplo:


dev:
    reflex -s -r '\.go$$' -- go run .
Enter fullscreen mode Exit fullscreen mode

Com isso você só precisa utilizar make dev e pronto.

Utilizando com Docker

Se o seu projeto utiliza docker-compose para inicializar as dependências que precisam subir com seu servidor, você também pode se beneficiar do hot reload.
Você consegue alcançar isso em 3 etapas:

  • Criando o Makefile na raiz do projeto, como foi apresentado acima.

  • Crie um Dockerfile somente para desenvolvimento:

Dockerfile.local

FROM golang:1.22.0-bullseye
WORKDIR /app

RUN go install github.com/cespare/reflex@v0.3.1
Enter fullscreen mode Exit fullscreen mode
  • Adicione command no seu service do docker-compose:
  seu-service:
    build:
      context: .
      dockerfile: Dockerfile.local
    volumes:
      - .:/app
    depends_on:
      - rabbitmq
    command: ['make', 'dev']
Enter fullscreen mode Exit fullscreen mode

Com isso você pode executar seu docker compose up --build normalmente, todos seus containers vão subir e seu servidor em Go vai fazer hot reload quando você editar os arquivos .go.

Ou seja, você não precisa reiniciar ou reconstruir seu container a cada alteração de código. Deixe para fazer isso quando tiver mudanças de infraestrutura.

. . . . . . . .