<?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>DEV Community: Ronildo </title>
    <description>The latest articles on DEV Community by Ronildo  (@ronildosousa).</description>
    <link>https://dev.to/ronildosousa</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%2F761419%2Fd39a7f58-8127-4a31-9b6d-c8764ca3456a.png</url>
      <title>DEV Community: Ronildo </title>
      <link>https://dev.to/ronildosousa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ronildosousa"/>
    <language>en</language>
    <item>
      <title>Padronizando seu código através dos Git Hooks</title>
      <dc:creator>Ronildo </dc:creator>
      <pubDate>Wed, 06 Mar 2024 14:02:15 +0000</pubDate>
      <link>https://dev.to/ronildosousa/padronizando-seu-codigo-atraves-dos-git-hooks-2go6</link>
      <guid>https://dev.to/ronildosousa/padronizando-seu-codigo-atraves-dos-git-hooks-2go6</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;No universo do desenvolvimento de software a padronização e consistência de um código são questões importantes. Porém, alcançá-las não é uma tarefa tão trivial, principalmente quando se trabalha em equipe. Neste contexto, os Git Hooks surgem como uma alternativa para lidar com estas questões, uma vez que permitem adicionar ações personalizadas durante o ciclo de vida do desenvolvimento de software.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que são os Git Hooks
&lt;/h2&gt;

&lt;p&gt;Basicamente os Git Hooks são scripts executados automaticamente sempre que um evento é executado em um repositório git, alguns desses eventos são, por exemplo, um commit ou um push.&lt;/p&gt;

&lt;p&gt;Ao iniciar um repositório do git, automaticamente os Git Hooks são criados no projeto, eles são basicamente scripts shell que vivem na pasta &lt;code&gt;.git/hooks&lt;/code&gt; do seu projeto. Porém, incialmente eles não são executados, pois possuem uma extensão &lt;code&gt;.sample&lt;/code&gt;, para serem executados basta remover esta extensão. (É importante que estes arquivos tenham permissão de execução)&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo22la0bwvlt9a8o0q3kd.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo22la0bwvlt9a8o0q3kd.gif" alt="mostra a criação dos git hooks"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como ilustrado na figura acima, são criados inúmeros hooks logo na inicialização do repositório git, alguns dos hooks mais utilizados são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pre-commit&lt;/code&gt; (me atentarei apenas a este hook)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prepare-commit-msg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;commit-msg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;post-commit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;post-checkout&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pre-rebase&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  O pre-commit Hook
&lt;/h3&gt;

&lt;p&gt;Assim como o nome sugere, este hook é disparado assim que o comando &lt;code&gt;git commit&lt;/code&gt; é executado. Como o nosso objetivo é garantir a consistência e a padronização do código, este hook pode ser um grande aliado, pois com ele é possível, por exemplo, executar os testes automatizados do projeto para garantir que o commit atual não quebre uma funcionalidade existente, ou também é possível executar algum &lt;code&gt;code sniffer&lt;/code&gt; para verificar se o código segue os padrões definidos. &lt;/p&gt;

&lt;p&gt;Caso o commit tenha alterações que quebrem algum dos testes automatizados ou não estejam no padrão do code sniffer, o commit não será executado, o que evitará que chegue ao repositório de produção qualquer código fora do padrão ou que quebre alguma funcionalidade existente.&lt;/p&gt;

&lt;h3&gt;
  
  
  O problema dos Hooks em equipe
&lt;/h3&gt;

&lt;p&gt;Os Git Hooks são grandes aliados durante o desenvolvimento e permitem garantir a consistência e o padrão de codificação, porém, temos um problema quando o trabalho em equipe entra em cena, uma vez que os hooks não são versionados, então, não seria possível os membros terem as versões atualizadas dos hooks. Contudo, existem alguns gerenciadores que auxiliam nessa situação como o caso do &lt;a href="https://typicode.github.io/husky/" rel="noopener noreferrer"&gt;Husky&lt;/a&gt; e do &lt;a href="https://github.com/captainhookphp/captainhook" rel="noopener noreferrer"&gt;CaptainHook&lt;/a&gt; (que irei mostrar neste post).&lt;/p&gt;

&lt;h2&gt;
  
  
  O CaptainHook
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;CaptainHook&lt;/strong&gt; é uma biblioteca PHP responsável por gerenciar os Git Hooks de um projeto. Através dele é possível configurar ações dos hooks através de um arquivo &lt;code&gt;.json&lt;/code&gt;, o que facilita bastante a configuração, pois normalmente estas são configuradas utilizando &lt;code&gt;shell script&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Com este arquivo de configuração &lt;code&gt;.json&lt;/code&gt; o captainhook consegue "transformar" as instruções em formato shell script nos arquivos dentro da pasta &lt;code&gt;.git/hooks&lt;/code&gt;. Uma vez que o arquivo json é versionado, todos os membros da equipe terão os git hooks atualizados e sempre iguais. &lt;/p&gt;

&lt;h3&gt;
  
  
  Como instalar
&lt;/h3&gt;

&lt;p&gt;Acesse a &lt;a href="https://captainhookphp.github.io/captainhook/" rel="noopener noreferrer"&gt;documentação&lt;/a&gt; para mais detalhes.&lt;/p&gt;

&lt;p&gt;A instalação é bem simples e pode ser feita através do composer:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

composer require &lt;span class="nt"&gt;--dev&lt;/span&gt; captainhook/captainhook


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Para garantir que os membros da equipe utilizem os mesmos hooks você pode executar o comando a seguir, assim a cada &lt;code&gt;composer install&lt;/code&gt; ou &lt;code&gt;composer update&lt;/code&gt; os hooks serão ativados, responda às perguntas conforme a sua necessidade:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

composer require &lt;span class="nt"&gt;--dev&lt;/span&gt; captainhook/plugin-composer


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Como configurar
&lt;/h3&gt;

&lt;p&gt;Com o CaptainHook instalado é hora de criar o arquivo de configuração que se chamará &lt;code&gt;captainhook.json&lt;/code&gt;, este arquivo conterá as ações a serem realizadas nos hooks do seu projeto, este arquivo é criado com o seguinte comando:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

vendor/bin/captainhook &lt;span class="nb"&gt;install&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Ele lhe permitirá escolher quais hooks você quer instalar e criará o arquivo de configuração, por enquanto instalarei apenas o pre-commit hook:&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmyqn945ibubo4mbtonwp.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmyqn945ibubo4mbtonwp.png" alt="instalaçaõ do captainhook"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após as configurações o captainhook irá criar um arquivo de configuração parecido com este, onde temos o nome do hook, se ele está ativado ou não e as ações que devem executadas em cada hook:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"commit-msg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"actions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"pre-commit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"actions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Definindo ações para o pre-commit
&lt;/h3&gt;

&lt;p&gt;Antes de mais nada é importante garantir que um novo commit não quebrará as funcionalidades já existentes no projeto, então nossa primeira ação será executar os testes antes de cada commit, para isso utilizarei o &lt;a href="https://pestphp.com/" rel="noopener noreferrer"&gt;Pest PHP&lt;/a&gt; e modificarei o arquivo de configuração da seguinte forma:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nl"&gt;"pre-commit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"actions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vendor/bin/pest --parallel"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Um exemplo de teste utilizando o Pest seria algo assim, neste momento o teste deveria passar:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'1 + 1 equals 2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&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;p&gt;Agora com o hook devidamente configurado, a cada commit que fizer o captainhook deveria executar os testes primeiramente, caso os teste falhem ele deve cancelar o commit:&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fczitlpm8aqz1bwub08p8.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fczitlpm8aqz1bwub08p8.png" alt="resultado captainhook apenas testes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Outro ponto mencionado anteriormente que é de extrema importância, é a padronização do estilo de código. Vamos adicionar um padronizador de estilo de código chamado &lt;a href="https://laravel.com/docs/10.x/pint" rel="noopener noreferrer"&gt;Laravel Pint&lt;/a&gt; às nossas ações de &lt;code&gt;pre-commit&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nl"&gt;"pre-commit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"actions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vendor/bin/pest --parallel"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vendor/bin/pint --test"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Com isso temos as duas ações executadas a cada commit, outras ações poderiam ser adicionadas tranquilamente caso fosse necessário, como, por exemplo, uma ferramenta de análise estática de código poderia ser adicionada como, por exemplo, o &lt;strong&gt;PHPStan&lt;/strong&gt; ou o &lt;strong&gt;Larastan&lt;/strong&gt;, o que mostra o poder e a facilidade de se utilizar o captainhook.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fph0xjzta4rrddmf9qolw.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fph0xjzta4rrddmf9qolw.png" alt="resultado captainhook testes e pint"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Os Git Hooks são ferramentas poderosas que auxiliam no desenvolvimento de software, principalmente quando se trabalha em equipe. Neste post apresentei algumas possibilidades do hook &lt;code&gt;pre-commit&lt;/code&gt; que permite executar ações antes que um código seja commitado, ações como, executar testes automatizados, analizadores de códigos, entre outras, além disso, conhecemos o &lt;strong&gt;CaptainHook&lt;/strong&gt;, que permite que os membros de uma equipe tenham acesso e configurem os hooks de forma fácil e intuitiva, por meio de um arquivo em formato &lt;code&gt;.json&lt;/code&gt;. Utilizando - se de tais ferramentas, o código desenvolvido em equipe ou até mesmo em projetos pessoais se tornará muito mais padronizado e dificilmente receberá bugs que já haviam sido corrigidos.&lt;/p&gt;

</description>
      <category>git</category>
      <category>laravel</category>
      <category>php</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
