Pular para o conteúdo principal

victorstein.dev

76/100 Dias de Golang - Hot Reload com Air

Table of Contents

# Hot Reload com Air

Ficar cancelando o go run main.go no terminal ou recompilando manualmente a cada alteração é bem cansativo. Para resolver isso, podemos usar o Air: uma ferramenta de hot reload que detecta mudanças nos arquivos e recompila automaticamente sua aplicação.

Vamos criar um projeto e instalar a dependência:

go install github.com/air-verse/air@latest

E no nosso main.go criar um endpoint bem simples:

package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintln(w, "Olá victorstein.dev")
	})
	fmt.Println("Olá victorstein.dev")
	http.ListenAndServe(":8080", nil)
}

Depois rodamos somente um comando:

air

A saída será:


  __    _   ___  
 / /\  | | | |_) 
/_/--\ |_| |_| \_ v1.61.7, built with Go go1.24.0

mkdir /home/victorstein/Cursos/golang-victor/go-air/tmp
watching .
!exclude tmp
building...
running...
Olá victorstein.dev

Temos como criar um arquivo de configuração air.toml com o comando air init. Esse arquivo criado será um padrão com várias flags definidas. Vou passa um aqui que eu encontrei para desenvolvimento:

root = "."
tmp_dir = "tmp"

[build]
  cmd = "go build -ldflags='-s -w' -o ./tmp/app ./main.go"
  bin = "tmp/app"
  include_ext = ["go", "yaml", "yml", "json"]
  exclude_dir = ["vendor", "tmp", "frontend", "docs"]
  exclude_regex = [".*_test.go$"]
  delay = 1000

[log]
  time = true

[color]
  main = "blue"
  watcher = "yellow"
  build = "green"

Podemos definir várias outras configs:

Variáveis de ambiente específicas para desenvolvimento:

[build]
  cmd = "go build -o ./tmp/main ."
  bin = "./tmp/main"
  args_bin = ["-env=development", "-debug=true"]

Excluir diretórios:

exclude_dir = ["vendor", "node_modules", ".git"]

Também é possível executar testes, integrar com Docker, entre outras funcionalidades. Vale a pena conferir a documentação oficial do Air.