<?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: Asafe Dainez</title>
    <description>The latest articles on DEV Community by Asafe Dainez (@asafedainez).</description>
    <link>https://dev.to/asafedainez</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%2F845702%2F3065e5e5-845d-4d93-81ea-e68837de846b.jpeg</url>
      <title>DEV Community: Asafe Dainez</title>
      <link>https://dev.to/asafedainez</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/asafedainez"/>
    <language>en</language>
    <item>
      <title>Entendendo padronização de commits (Conventional Commits)</title>
      <dc:creator>Asafe Dainez</dc:creator>
      <pubDate>Mon, 23 May 2022 14:32:36 +0000</pubDate>
      <link>https://dev.to/asafedainez/entendendo-padronizacao-de-commits-conventional-commits-2fb9</link>
      <guid>https://dev.to/asafedainez/entendendo-padronizacao-de-commits-conventional-commits-2fb9</guid>
      <description>&lt;h1&gt;
  
  
  Motivação
&lt;/h1&gt;

&lt;p&gt;A um tempo venho pesquisando sobre o tema de padronização de commits e olhando ferramentas para facilitar o uso (coisa que vou apresentar mais a frente).E recentemente participei de uma palestra rápida do &lt;a href="https://www.linkedin.com/in/ivanrosolen/" rel="noopener noreferrer"&gt;Ivan Rosolen&lt;/a&gt; sobre o tema e isso me fez querer compartilhar o conhecimento que adquiri com muita pesquisa. Muitos dos conteúdos trazidos aqui foram encontrados na apresentação do Ivan.&lt;/p&gt;

&lt;h1&gt;
  
  
  O que é &lt;strong&gt;Padronização de Commits&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Essa padronização veio para solucionar um problema que muita gente encontra ao fazer uma revisão de um PR (pull request), ou quando se entra em uma empresa ou squad novo e tenta entender o que foi feito no fluxo de trabalho do Git.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Trate o git como uma ferramenta de comunicação e não de armazenamento de código&lt;br&gt;
De Jair Henrique no Twitter&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Como a frase acima propõe, o git deve ser um storytelling de como a aplicação está no momento para que qualquer um que veja e entenda o que foi feito, mesmo não sendo da área. &lt;/p&gt;

&lt;p&gt;Utilizando essa padronização é muito mais simples de uma pessoa nova no projeto entender o que foi feito e a comunicação entre a equipe fica muito mais fluida e assertiva.&lt;/p&gt;

&lt;p&gt;Essa padronização começou sendo criada pelos usuários de Angular, mas pode ser aplicada a qualquer linguagem.&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%2F2cw36k091mmyt0a7jcxc.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%2F2cw36k091mmyt0a7jcxc.png" alt="Imagem mostrando histórico de uma aplicação usando padronização de commits"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A imagem acima mostra um histórico de uma aplicação usando padronização de commits, que por acaso é do &lt;a href="https://github.com/conventional-commits/conventionalcommits.org" rel="noopener noreferrer"&gt;repositório&lt;/a&gt; da iniciativa.&lt;/p&gt;

&lt;h1&gt;
  
  
  Vantagens
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Ao utilizar o padrão, se evita commits muito vagos que não se explica a alteração;&lt;/li&gt;
&lt;li&gt;Comunica a mudança feita na aplicação para as pessoas da equipe, e para qualquer outra pessoa interessada com objetividade e assertividade;&lt;/li&gt;
&lt;li&gt;Descreve o motivo da alteração ou correção do código;&lt;/li&gt;
&lt;li&gt;Facilita a contribuição de outras pessoas ao projeto.&lt;/li&gt;
&lt;li&gt;Facilita o versionamento semântico e criação de CHANGELOG.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Estrutura
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;tipo&amp;gt;[escopo opcional]: &amp;lt;breve descrição&amp;gt;

[corpo (opcional)]

[rodapé opcional]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;strong&gt;tipo&lt;/strong&gt; segue uma lista predefinida que pode ser modificada de acordo com o projeto ou organização que utiliza.&lt;/p&gt;

&lt;p&gt;Os tipos são descritos mais a frente.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;escopo&lt;/strong&gt; é a funcionalidade ou contexto da aplicação.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;descrição&lt;/strong&gt; deve ser uma descrição sucinta da mudança.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use o imperativo, tempo presente: "mudança" não "mudou" nem "muda"&lt;/li&gt;
&lt;li&gt;não capitalize a primeira letra&lt;/li&gt;
&lt;li&gt;sem ponto (.) no final&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O &lt;strong&gt;corpo&lt;/strong&gt; é a descrição do que foi feito detalhadamente. &lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;rodapé&lt;/strong&gt; é usado para links de referência como issues do gitHub, tikets do Jira, etc.&lt;/p&gt;

&lt;h1&gt;
  
  
  Tipos
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;build&lt;/strong&gt;: São alterações que afetam o sistema de build do projeto ou dependências externas.&lt;br&gt;
&lt;strong&gt;chore&lt;/strong&gt;: São alterações em arquivos que não influenciam no código de produção da aplicação, ou seja, nada que o usuário final veja. Como alterar um arquivo &lt;code&gt;.gitignore&lt;/code&gt;, &lt;code&gt;package.json&lt;/code&gt;, etc.&lt;br&gt;
&lt;strong&gt;static&lt;/strong&gt;: São alterações no conteúdo de arquivos estáticos como dados &lt;code&gt;.json&lt;/code&gt;, imagens, etc.&lt;br&gt;
&lt;strong&gt;cd&lt;/strong&gt;: São alterações em nossos arquivos e scripts de configurações para CD (entrega contínua).&lt;br&gt;
&lt;strong&gt;ci&lt;/strong&gt;: São alterações em nossos arquivos e scripts de configurações para CI (integração contínua).&lt;br&gt;
&lt;strong&gt;docs&lt;/strong&gt;: São alterações ou criação de documentação.&lt;br&gt;
&lt;strong&gt;feat&lt;/strong&gt;: Um novo recurso.&lt;br&gt;
&lt;strong&gt;fix&lt;/strong&gt;: Uma correção de bug da aplicação.&lt;br&gt;
&lt;strong&gt;improve&lt;/strong&gt;: Uma alteração de código que melhore o comportamento de um recurso.&lt;br&gt;
&lt;strong&gt;perf&lt;/strong&gt;: Uma alteração de código que melhore o desempenho ou performance.&lt;br&gt;
&lt;strong&gt;refactor&lt;/strong&gt;: Uma alteração que não corrige um bug nem adiciona um novo recurso, só refatora o que já foi feito.&lt;br&gt;
&lt;strong&gt;style&lt;/strong&gt;: Alterações que não afetam o significado do código só alteram um espaço em branco, formatação, ponto e vírgula, etc.&lt;br&gt;
&lt;strong&gt;revert&lt;/strong&gt;: reverter para um commit anterior&lt;br&gt;
&lt;strong&gt;test&lt;/strong&gt;: Adiciona testes ausentes ou corrige testes já existentes.&lt;/p&gt;

&lt;p&gt;Para mais detalhes veja a &lt;a href="https://www.conventionalcommits.org/pt-br/v1.0.0/" rel="noopener noreferrer"&gt;documentação oficial&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Os tipos mais utilizados no dia a dia
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;feat&lt;/li&gt;
&lt;li&gt;fix&lt;/li&gt;
&lt;li&gt;refactor&lt;/li&gt;
&lt;li&gt;improve&lt;/li&gt;
&lt;li&gt;test&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Exemplo de um commit seguindo o padrão
&lt;/h2&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%2Fno00kj2z5kyttmqzhddt.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%2Fno00kj2z5kyttmqzhddt.png" alt="Imagem de um commit seguindo o padrão"&gt;&lt;/a&gt;&lt;br&gt;
*Essa imagem foi retirada da apresentação do Ivan que está referenciada ao final.&lt;/p&gt;
&lt;h1&gt;
  
  
  Ferramentas para facilitar o uso
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Obs:&lt;/strong&gt; Como última ferramenta mostro uma extensão para VSCode que facilita tudo o que essas ferramentas a seguir fazem.&lt;/p&gt;

&lt;p&gt;Aqui vou mostrar como instalar e usar algumas ferramentas muito legais que eu uso desenvolvendo em JavaScript, que são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/conventional-changelog/commitlint" rel="noopener noreferrer"&gt;CommitLint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://typicode.github.io/husky/#/" rel="noopener noreferrer"&gt;Husky&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/commitizen/cz-cli" rel="noopener noreferrer"&gt;Commitizen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Para que cada um serve?
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;CommitLint&lt;/strong&gt; é uma ferramenta que verifica se seu commit está seguindo o padrão da estrutura, como vimos acima. Ele utiliza o &lt;strong&gt;Husky&lt;/strong&gt; para verificar seus commits antes de serem finalizados. O Husky gera um script que intercepta seu commit, passando ele para o CommitLint para ser verificado. &lt;br&gt;
Caso seu commit não siga os padrões, ele é rejeitado e retorna uma mensagem de erro sobre seu commit.&lt;br&gt;
O &lt;strong&gt;Commitizen&lt;/strong&gt; é uma ferramenta de automação que te ajuda a estruturar seu commit de forma mais simples, agindo como perguntas e respostas. Primeiro pergunta qual o tipo de alteração, escopo, descrição, corpo, se houve uma breaking change, e por fim se afeta uma issue que é no rodapé.&lt;/p&gt;

&lt;p&gt;A imagem abaixo mostra um exemplo de uso do Commitizen em paralelo ao CommitLint e Husky.&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%2Fclkoocn89thbjspsr6os.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%2Fclkoocn89thbjspsr6os.png" alt="Imagem mostrando um exemplo de uso do Commitizen em paralelo ao CommitLint e Husky"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para instalar essas ferramentas, entre em seu projeto e faça os seguintes passos:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lembrando&lt;/strong&gt;: qualquer problema na instalação, entre na página oficial do repositório e siga os passos ditos por lá.&lt;/p&gt;

&lt;p&gt;1 - Instale o CommitLint&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -D @commitlint/{config-conventional,cli}

echo "module.exports = {extends: ['@commitlint/config-conventional']}" &amp;gt; commitlint.config.js

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

&lt;/div&gt;



&lt;p&gt;2 - Instale o Husky e ative os hooks&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -D husky

npx husky install

cat &amp;lt;&amp;lt;EEE &amp;gt; .husky/commit-msg
#!/bin/sh
. "\$(dirname "\$0")/_/husky.sh"

npx --no -- commitlint --edit "\${1}"
EEE

chmod a+x .husky/commit-msg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse momento, se você tentar fazer um commit que não siga o padrão, ele será rejeitado.&lt;/p&gt;

&lt;p&gt;3 - Instale o Commitizen&lt;br&gt;
Primeiramente você deve deixar seu repositório preparado para receber o Commitizen&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install commitizen -g

commitizen init cz-conventional-changelog --save-dev --save-exact
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seu arquivo &lt;code&gt;package.json&lt;/code&gt; adicione:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; "config": {
    "commitizen": {
      "path": "cz-conventional-changelog"
    }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto!&lt;br&gt;
Agora é só digitar &lt;code&gt;git cz&lt;/code&gt; ou apenas &lt;code&gt;cz&lt;/code&gt; e o Commitizen abrirá para você estruturar seu commit padronizado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Melhor para o final!
&lt;/h2&gt;

&lt;p&gt;Existe uma extensão chamada &lt;a href="https://marketplace.visualstudio.com/items?itemName=vivaxy.vscode-conventional-commits" rel="noopener noreferrer"&gt;Conventional Commits&lt;/a&gt; para o VSCode que simplesmente facilita a vida ao utilizar o padrão, pois ele estrutura completamente seu commit. &lt;br&gt;
No link acima, tem toda a descrição e forma de utilização da extensão.&lt;/p&gt;

&lt;h1&gt;
  
  
  Referências
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://speakerdeck.com/ivanrosolen/conventional-commits?slide=24" rel="noopener noreferrer"&gt;Conventional Commits por Ivan Rosolen&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>braziliandevs</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Diferença entre NPM e Yarn</title>
      <dc:creator>Asafe Dainez</dc:creator>
      <pubDate>Mon, 09 May 2022 22:33:34 +0000</pubDate>
      <link>https://dev.to/asafedainez/diferenca-entre-npm-e-yarn-2hkh</link>
      <guid>https://dev.to/asafedainez/diferenca-entre-npm-e-yarn-2hkh</guid>
      <description>&lt;h2&gt;
  
  
  Contexto
&lt;/h2&gt;

&lt;p&gt;Pra entender o &lt;em&gt;Yarn&lt;/em&gt; é interessante saber o motivo pra ele ser desenvolvido. Antes dele ser criado, o &lt;em&gt;NPM&lt;/em&gt; tinha vários problemas crônicos como velocidade de instalação dos pacotes e um grave problema com segurança dos pacotes disponibilizados, não verificando se existiam requisições suspeitas dentro dos pacotes baixados.&lt;br&gt;
Então na época o &lt;em&gt;Yarn&lt;/em&gt; trouxe uma velocidade de instalação muito maior por instalar os pacotes em paralelo, ao contrário do &lt;em&gt;NPM&lt;/em&gt; que utiliza instalação sequencial. Mas algo que trouxe muita relevância pro &lt;em&gt;Yarn&lt;/em&gt; foi a segurança que ele trazia pois suas políticas de segurança eram muito melhores do que o &lt;em&gt;NPM&lt;/em&gt; tinha.&lt;/p&gt;

&lt;p&gt;Após muitas atualizações o &lt;em&gt;NPM&lt;/em&gt; melhorou muito e trouxe várias melhorias para o tempo de instalação, que está similar e em questão de segurança.&lt;/p&gt;

&lt;p&gt;Então antes o &lt;em&gt;Yarn&lt;/em&gt; era uma solução, mas hoje, é uma alternativa pois o &lt;em&gt;NPM&lt;/em&gt; e &lt;em&gt;Yarn&lt;/em&gt; já estão muito parecidos e é mais uma preferência pessoal de uso.&lt;/p&gt;

&lt;p&gt;Os comandos são extremamente similares, facilitando o aprendizado e migração de um para o outro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Características
&lt;/h2&gt;

&lt;h3&gt;
  
  
  NPM
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Instalação sequencial;&lt;/li&gt;
&lt;li&gt;Nativo no node.js;&lt;/li&gt;
&lt;li&gt;Cria arquivo package-lock.json&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Compatibilidade com todas as versões do node&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desvantagens:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Saída de comandos ou erros retornados difíceis de ler&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apesar de todas as melhorias com segurança, ainda existem algumas vulnerabilidades&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Yarn
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Instalação paralela&lt;/li&gt;
&lt;li&gt;Gera arquivo &lt;code&gt;yarn.lock&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Defende a velocidade e segurança&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cache de alguns pacotes (gerando maior velocidade na instalação)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desvantagens:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Não funciona com node V5 ou mais antigos&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Necessita ser instalado 'por fora' (utilizando NPM ou outra forma)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Yarn 2.x
&lt;/h2&gt;

&lt;p&gt;O Yarn 2.X é uma nova forma de gerenciador de pacotes pois ele cria uma espécie de BD de pacotes na sua máquina para evitar várias instalações de pacotes de diferentes projetos. Existem algumas vantagens com isso como reaproveitamento de pacotes (&lt;em&gt;zero installs&lt;/em&gt;). Nessa versão não se usa a pasta &lt;code&gt;node_modules&lt;/code&gt;, pois os pacotes estão instalados em outro local no seu computador. Para linkar os pacotes é gerado um arquivo chamado &lt;code&gt;.pnp.cjs&lt;/code&gt; (&lt;em&gt;Plug'n'Play&lt;/em&gt;).&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>braziliandevs</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
