Como utilizar live reload para melhorar sua produtividade

Se você se sente incomodado em ter que parar sua aplicação e fazer go run novamente toda vez que faz uma alteração, esse post vai melhorar sua vida… e MUITO.

Nesse post vou te mostrar como fazer live reload de aplicações Go utilizando uma ferramenta open source chamada Air (https://github.com/cosmtrek/air).

Para testar as funcionalidades da ferramenta, vamos escrever um pequeno programa que retorna um “Olá mundo”.

Vamos inicializar um novo módulo com o comando go mod init github.com/aprendagolang/live-reload e criar um arquivo main.go com o seguinte conteúdo.

package main

import (
    "net/http"

    "github.com/go-chi/chi/v5"
)

func main() {
    r := chi.NewRouter()

    r.Get("/", func(rw http.ResponseWriter, r *http.Request) {
        rw.Write([]byte("Olá Mundo"))
    })

     http.ListenAndServe(":8080", r)
}

Como estamos utilizando uma dependência externa, vamos executar o go mod tidy para atualizar nosso go.mod, que deve ficar parecido com isso:

module github.com/aprendagolang/live-reload

go 1.18

require github.com/go-chi/chi/v5 v5.0.7

Com nosso pequeno programa escrito, vamos instalar o Air.

Por ser escrito em Go, podemos fazer sua instalação utilizando o próprio install do Go.

go install github.com/cosmtrek/air@latest

Para testar se deu tudo certo com a instalação, execute um air -v no seu terminal. Se a instação ocorreu sem problemas, você deverá ver o seguinte output:

Agora vamos criar um arquivo de configuração para o Air com o comando air init. Esse comando irá criar um arquivo chamado .air.toml com o seguinte conteúdo.

root = "."
testdata_dir = "testdata"
tmp_dir = "tmp"

[build]
  args_bin = []
  bin = "./tmp/main"
  cmd = "go build -o ./tmp/main ."
  delay = 1000
  exclude_dir = ["assets", "tmp", "vendor", "testdata"]
  exclude_file = []
  exclude_regex = ["_test.go"]
  exclude_unchanged = false
  follow_symlink = false
  full_bin = ""
  include_dir = []
  include_ext = ["go", "tpl", "tmpl", "html"]
  kill_delay = "0s"
  log = "build-errors.log"
  send_interrupt = false
  stop_on_error = true

[color]
  app = ""
  build = "yellow"
  main = "magenta"
  runner = "green"
  watcher = "cyan"

[log]
  time = false

[misc]
  clean_on_exit = false

[screen]
  clear_on_rebuild = false

Uma pequena mudança que eu gosto de fazer é mudar o time para true. Porém se você não quiser, não precisa alterar nada nesse arquivo.

Agora tudo que precisamos fazer é executar o comando air no terminal e nosso live reload já estará funcionando.

Para testar o live reload, vamos modificar o nosso r.Get("/", ... para o seguinte:

r.Get("/{name}", func(rw http.ResponseWriter, r *http.Request) {
    name := chi.URLParam(r, "name")

    rw.Header().Add("Content-Type", "application/json")
    json.NewEncoder(rw).Encode(map[string]string{
        "message": fmt.Sprintf("Olá %s!!!", name),
    })
})

Como podemos ver no terminal, a aplicação foi recompilada automaticamente.

É isso, espero que essa dica ajude a melhorar sua produtividade.

Deixem suas dúvidas nos comentários.

Até a próxima!


Se inscreva na nossa newsletter

* indicates required