<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Felipe Araújo</title>
    <description>The latest articles on Forem by Felipe Araújo (@itsfpbtw).</description>
    <link>https://forem.com/itsfpbtw</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1182717%2F216bbb4f-7f20-43ea-bbac-05fbcb2ddf13.jpg</url>
      <title>Forem: Felipe Araújo</title>
      <link>https://forem.com/itsfpbtw</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/itsfpbtw"/>
    <language>en</language>
    <item>
      <title>Como configurar Golang com live reload utilizando Air 🚀</title>
      <dc:creator>Felipe Araújo</dc:creator>
      <pubDate>Mon, 04 Mar 2024 23:30:34 +0000</pubDate>
      <link>https://forem.com/itsfpbtw/como-configurar-golang-com-live-reload-utilizando-air-1hg5</link>
      <guid>https://forem.com/itsfpbtw/como-configurar-golang-com-live-reload-utilizando-air-1hg5</guid>
      <description>&lt;p&gt;Esse tutorial é direto e prático, sem copiar e colar comandos que não fazem sentido. Vou te explicar cada comando e configuração para que você compreenda o que está acontecendo. Isso vai facilitar a configuração e também te capacitar a resolver eventuais problemas que possam surgir durante o processo - &lt;em&gt;e, acredite, eles podem acontecer&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❗ Problema
&lt;/h2&gt;

&lt;p&gt;A necessidade de reiniciar constantemente a aplicação ao realizar alterações no código pode ser desgastante e prejudicar a nossa produtividade enquanto desenvolvedores.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ Solução
&lt;/h2&gt;

&lt;p&gt;O uso de ferramentas como o Air automatiza o processo de live reload, economizando tempo e melhorando a eficiência durante o processo de desenvolvimento. Ou seja, você só se preocupa em codificar e salvar o arquivo enquanto ele faz todo o trabalho de sempre executar o código mais atualizado.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚠️ Requisitos obrigatórios
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Go na versão &lt;code&gt;1.22&lt;/code&gt; ou superior;&lt;/li&gt;
&lt;li&gt;Acesso ao terminal do seu sistema.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📂 Inicializando um projeto Go
&lt;/h2&gt;

&lt;p&gt;*Já tem um projeto Go inicializado? Vá direto para Configurando Air.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 1:
&lt;/h3&gt;

&lt;p&gt;Crie uma pasta para o projeto de exemplo e mude para a pasta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;live-reload-go
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;live-reload-go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Passo 2:
&lt;/h3&gt;

&lt;p&gt;Dentro da pasta recém-criada, inicialize um projeto Go. Normalmente, os projetos Go seguem o formato "&lt;code&gt;github.com&lt;/code&gt;/&lt;code&gt;nickname&lt;/code&gt;/&lt;code&gt;nome-do-projeto&lt;/code&gt;". No entanto, você pode personalizar o caminho do repositório ou colocar outro nome conforme necessário, no meu caso colocarei meu repositório:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;go mod init github.com/felipelaraujo/live-reload-go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Passo 3:
&lt;/h3&gt;

&lt;p&gt;Com o &lt;code&gt;go.mod&lt;/code&gt; criado, precisamos de uma função &lt;code&gt;main&lt;/code&gt; com um servidor HTTP básico dentro. Para isso, crie a pasta &lt;code&gt;cmd/&lt;/code&gt; e o arquivo &lt;code&gt;main.go&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;cmd
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;cmd/main.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cole o seguinte código no seu &lt;code&gt;main.go&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cmd/main.go&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"log"&lt;/span&gt;
    &lt;span class="s"&gt;"net/http"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Criando uma instância do servidor&lt;/span&gt;
    &lt;span class="n"&gt;mux&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewServeMux&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c"&gt;// Configurando rota e função handler&lt;/span&gt;
    &lt;span class="n"&gt;mux&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"GET /"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusOK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello, world!"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="c"&gt;// Iniciando o servidor&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ListenAndServe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;":3000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mux&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2 id="configurando-air"&gt;☁️ Configurando Air&lt;/h2&gt;

&lt;h3&gt;
  
  
  Passo 1:
&lt;/h3&gt;

&lt;p&gt;Ao realizar a instalação global do Air, você garante a presença constante do comando &lt;code&gt;air&lt;/code&gt; em seu sistema, eliminando a necessidade de reinstalação no futuro.&lt;/p&gt;

&lt;p&gt;Instale o Air globalmente com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/cosmtrek/air@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Certifique-se de ter todas as variáveis de ambiente Go configuradas corretamente para que o comando &lt;code&gt;air&lt;/code&gt; seja reconhecido pelo seu terminal.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 2:
&lt;/h3&gt;

&lt;p&gt;Crie o arquivo de configuração do Air na raiz do projeto com o nome &lt;code&gt;.air.toml&lt;/code&gt; e cole o seguinte conteúdo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.air.toml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="c"&gt;# Raiz do projeto onde os comandos serão executados.&lt;/span&gt;
&lt;span class="py"&gt;root&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"."&lt;/span&gt;
&lt;span class="c"&gt;# Local onde a pasta temporária receberá os outputs do Air.&lt;/span&gt;
&lt;span class="py"&gt;tmp_dir&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"tmp"&lt;/span&gt;

&lt;span class="nn"&gt;[build]&lt;/span&gt;
&lt;span class="c"&gt;# Comando shell buildando o executável.&lt;/span&gt;
&lt;span class="c"&gt;# O primeiro argumento recebe onde será&lt;/span&gt;
&lt;span class="c"&gt;# o output do executável e o segundo argumento é&lt;/span&gt;
&lt;span class="c"&gt;# qual arquivo queremos transformar em binário.&lt;/span&gt;
&lt;span class="py"&gt;cmd&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"go build -o ./tmp/main ./cmd/main.go"&lt;/span&gt;

&lt;span class="c"&gt;# Local onde estará o executável do build (binário).&lt;/span&gt;
&lt;span class="py"&gt;bin&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"./tmp/main"&lt;/span&gt;

&lt;span class="c"&gt;# Array com nomes de arquivos e/ou diretórios para se ignorar.&lt;/span&gt;
&lt;span class="c"&gt;# Estou ignorando a pasta /tmp pois ela não faz parte do meu programa.&lt;/span&gt;
&lt;span class="py"&gt;exclude_dir&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"tmp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"assets"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c"&gt;# Array com expressões regex para ignorar arquivos com nomes específicos.&lt;/span&gt;
&lt;span class="py"&gt;exclude_regex&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"_test&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;.go"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c"&gt;# Ignora arquivos que não foram alterados.&lt;/span&gt;
&lt;span class="py"&gt;exclude_unchanged&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="c"&gt;# Array de extensões de arquivos para incluir no build.&lt;/span&gt;
&lt;span class="py"&gt;include_ext&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"go"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"tpl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"tmpl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"html"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c"&gt;# Nome do arquivo de log que ficará dentro da pasta tmp.&lt;/span&gt;
&lt;span class="py"&gt;log&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"build-errors.log"&lt;/span&gt;

&lt;span class="c"&gt;# Encerra o executável antigo caso ocorra algum erro no build.&lt;/span&gt;
&lt;span class="py"&gt;stop_on_error&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

&lt;span class="nn"&gt;[color]&lt;/span&gt;
&lt;span class="c"&gt;# Cores de onde vem os logs no console.&lt;/span&gt;
&lt;span class="py"&gt;app&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;
&lt;span class="py"&gt;build&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"yellow"&lt;/span&gt;
&lt;span class="py"&gt;main&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"magenta"&lt;/span&gt;
&lt;span class="py"&gt;runner&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"green"&lt;/span&gt;
&lt;span class="py"&gt;watcher&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"cyan"&lt;/span&gt;

&lt;span class="nn"&gt;[log]&lt;/span&gt;
&lt;span class="c"&gt;# Mostra o horário do log.&lt;/span&gt;
&lt;span class="py"&gt;time&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="c"&gt;# Mostra apenas os logs da aplicação e não do Air.&lt;/span&gt;
&lt;span class="py"&gt;main_only&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

&lt;span class="nn"&gt;[misc]&lt;/span&gt;
&lt;span class="c"&gt;# Deleta a pasta tmp no encerramento da aplicação.&lt;/span&gt;
&lt;span class="py"&gt;clean_on_exit&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="nn"&gt;[screen]&lt;/span&gt;
&lt;span class="c"&gt;# Limpa o console após o rebuild da aplicação.&lt;/span&gt;
&lt;span class="py"&gt;clear_on_rebuild&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;    
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Para uma lista completa de configurações, consulte &lt;a href="https://github.com/cosmtrek/air/blob/master/air_example.toml" rel="noopener noreferrer"&gt;air_example.toml&lt;/a&gt;. Certifique-se de ajustar as configurações conforme necessário para o seu projeto.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Executando o projeto
&lt;/h2&gt;

&lt;p&gt;A estrutura final do projeto deve ser semelhante a esta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
├── cmd/
│ └── main.go
├── .air.toml
└── go.mod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com tudo configurado, inicie a aplicação usando o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;air
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora você pode alterar qualquer arquivo do projeto e salvar para ver o Air fazendo seu trabalho:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffelipelaraujo%2Flive-reload-go%2Fmain%2Fassets%2Fair.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffelipelaraujo%2Flive-reload-go%2Fmain%2Fassets%2Fair.gif" alt="GIF demonstrando o Air re-executando o código quando há uma nova alteração nos arquivos do projeto"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Legal, né?! Espero ter te ajudado!&lt;br&gt;
Abraço!&lt;/p&gt;

&lt;h2&gt;
  
  
  Links úteis:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;☁️ &lt;a href="https://github.com/cosmtrek/air" rel="noopener noreferrer"&gt;Repositório do Air&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Meus links:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;👨🏽‍💻 &lt;a href="https://github.com/itsfpbtw" rel="noopener noreferrer"&gt;Github&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;👔 &lt;a href="https://www.linkedin.com/in/felipe-l-araujo/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>go</category>
      <category>tutorial</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
