Logo

dev-resources.site

for different kinds of informations.

Go + hot reload

Published at
2/23/2024
Categories
go
tutorial
portugues
Author
bgskurono
Categories
3 categories in total
go
open
tutorial
open
portugues
open
Author
9 person written this
bgskurono
open
Go + hot reload

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/[email protected]
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/[email protected]
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.

portugues Article's
30 articles in total
Favicon
Validação e Sanitização em Aplicações Web
Favicon
Golang básico - Comparação de Igualdade
Favicon
Guia de React re-render: tudo, tudo de uma vez
Favicon
Go + hot reload
Favicon
Como animar o scrolling para anchor links com CSS
Favicon
Como criar uma sticky navigation apenas com CSS
Favicon
Como usar requestAnimationFrame() com vanilla JS
Favicon
Como atualizar a URL do navegador sem refresh a página usando a vanilla JS History API
Favicon
Por que utilizar um elemento form quando submit campos com JavaScript?
Favicon
Quando um framework é melhor que a manipulação nativa do DOM
Favicon
Recursão com vanilla JavaScript
Favicon
Como usar async e await com vanilla JavaScript
Favicon
Construindo um show/hide disclosure component acessível com vanilla JS
Favicon
Eu <3 cascade!
Favicon
Você provavelmente não precisa de um DOMContentLoaded event em seu Javacript
Favicon
Formas de escrever Immediately Invoked Function Expression (IIFE) no JavaScript
Favicon
Event delegation e múltiplos seletores com vanilla JS
Favicon
Usando a propriedade CSS currentColor para contruir componentes extensíveis
Favicon
CurrentColor e SVGs
Favicon
WTF é gzipping (e como é diferente da minificação)?
Favicon
Como eu estruturo meus projetos vanilla JS
Favicon
Uma alternativa vanilla JS para o método moment.js timeFromNow()
Favicon
Recriando o método lodash partition() em vanilla JS
Favicon
Recriando o método lodash inRange() em vanilla JS
Favicon
Recriando o método lodash pull() em vanilla JS
Favicon
Como converter segundos para minutos e horas em vanila JS
Favicon
Gerando números randômicos com vanila JS
Favicon
Obtendo os meses formatados com vanila JS
Favicon
Como ser um desenvolvedor mais produtivo
Favicon
Como construir um site que carregue em menos de um segundo

Featured ones: