Olivier Lacan bee0534514 Make page title & description dynamic
Previously they had to be duplicated from the page
frontmatter but that's not necessary and also makes
it possible to have correct OpenGraph title and
descriptions.
2024-02-04 21:13:49 -08:00

206 lines
9.4 KiB
Plaintext

---
title: Mantenha um CHANGELOG
description: Não deixe seus amigos despejarem logs de commits em CHANGELOGs
language: pt-BR
version: 0.3.0
---
%h1= current_page.data.title
%h2= current_page.data.description
Version <strong>#{current_page.metadata[:page][:version]}</strong>
:markdown
### O que é um *changelog*?
Um *changelog* é um arquivo que contém uma lista selecionada, ordenada
cronologicamente, de mudanças significativas para cada versão de um projeto
*open source*.
<pre class="changelog">#{File.read("CHANGELOG.md")}</pre>
:markdown
### Para que serve um *changelog*?
Para facilitar que usuários e contribuidores vejam precisamente quais
mudanças significativas foram realizadas entre cada versão publicada.
### Por que eu deveria me importar?
Porque softwares são feitos para pessoas. Se você não liga, por que está
contribuindo com projetos *open source*? Certamente deve haver um fundo de
carinho em algum lugar desse seu amável cerebrinho.
Eu [conversei com Adam Stacoviak e Jerod Santo no podcast do The
Changelog][thechangelog] (faz sentido, hein?) sobre por que mantenedores e
contribuidores *open source* devem se importar e as motivações por trás desse
projeto. Se você tem tempo (1:06), é um bom programa.
### O que faz um *changelog* ser bom?
Que bom que perguntou.
Um bom *changelog* se atém a esses princípios:
- É feito para seres humanos, não máquinas, então legibilidade é crucial.
- É fácil de referenciar (*linkar*) qualquer seção (por isso Markdown ao
invés de puro texto).
- Uma subseção por versão.
- Lista as versões publicadas em ordem cronológica decrescente (mais novo em
cima).
- Usa todas as datas no formato `AAAA-MM-DD`. (Exemplo: `2012-06-02` para
`2 de Junho de 2012`.) É internacional, [sensato](https://xkcd.com/1179/), e
independente de língua.
- Menciona explicitamente se o projeto segue o [Versionamento Semântico][semver].
- Cada versão deve:
- Listar sua data de publicação no formato acima.
- Agrupar mudanças descrevendo seus impactos no projeto, como segue:
- `Added`/`Adicionado` para novas funcionalidades.
- `Changed`/`Modificado` para mudanças em funcionalidades existentes.
- `Deprecated`/`Obsoleto` para funcionalidades estáveis que foram removidas das
próximas versões.
- `Removed`/`Removido` para funcionalidades removidas desta versão.
- `Fixed`/`Consertado` para qualquer correção de bug.
- `Security`/`Segurança` para incentivar usuários a atualizarem em caso de
vulnerabilidades.
### Como eu posso minimizar o esforço exigido?
Mantenha sempre uma seção `"Unreleased"`\`"A publicar"` no topo para manter o controle de
quaisquer mudanças.
Isso serve a dois propósitos:
- As pessoas podem ver quais mudanças elas podem esperar em publicações
futuras.
- No momento da publicação, você apenas tem de mudar o `"Unreleased"`\`"A publicar"` para o
número de versão e adicionar um novo cabeçalho `"Unreleased"`\`"A publicar"` no topo.
### O que faz os unicórnios chorarem?
Tudo bem... vamos lá.
- **Despejar logs de commits.** Simplesmente não faça isso, você não está
ajudando ninguém.
- **Não dar ênfase nas obsolências.** Quando as pessoas atualizam de uma versão
para outra, deve ser incrivelmente claro quando algo irá parar de funcionar.
- **Datas em formatos específicos de uma região.** Nos Estados Unidos, as pessoas
colocam o mês primeiro ("06-02-2012" para 2 de Junho de 2012, o que *não*
faz sentido), enquanto muitos no resto do mundo escrevem em aspecto
robótico "2 Junho 2012", e mesmo assim leem de forma diferente.
"2012-06-02" funciona de maneira lógica do maior para o menor, não
se confunde de maneira ambígua com outros formatos, e é um [padrão
ISO](http://www.iso.org/iso/home/standards/iso8601.htm). Portanto, é o
formato recomendado para *changelogs*.
Tem mais. Ajude-me a coletar essas lágrimas de unicórnio [abrindo uma
issue][issues] ou um *pull request*.
### Existe um padrão de formato de *changelog*?
Infelizmente, não. Calma. Eu sei que você está buscando furiosamente
aquele link do guia GNU de estilo de *changelog*, ou o arquivo "guideline"
de dois paragráfos do GNU NEWS. O estilo GNU é um bom começo mas, infelizmente, é ingênuo.
Não há nada de errado em ser ingênuo mas, quando as pessoas precisam de orientação,
raramente ajuda. Especialmente quando existem muitas situações excepcionais
para lidar.
Este projeto [contém o que eu espero se tornar um melhor padrão de arquivo
CHANGELOG][CHANGELOG] para todos os projetos *open source*. Eu não acredito que o status quo
seja bom o suficiente, e acho que, como uma comunidade, nós podemos encontrar novas convenções
se tentarmos extrair boas práticas de projetos de software reais. Por favor, dê uma olhada e
lembre-se de que [discussões e sugestões de melhorias são bem-vindas][issues]!
### Qual deve ser o nome do arquivo *changelog*?
Bom, se você não notou no exemplo acima, `CHANGELOG.md` é a melhor convenção até agora.
Alguns outros projetos também utilizam `HISTORY.txt`, `HISTORY.md`,
`History.md`, `NEWS.txt`, `NEWS.md`, `News.txt`, `RELEASES.txt`,
`RELEASE.md`, `releases.md`, etc.
É uma bagunça. Todos esses nomes só dificultam encontrar o *changelog*.
### Por que as pessoas não podem simplesmente utilizar `git log`?
Porque os logs do Git são cheios de ruído — por natureza. Eles não serviriam como um
changelog adequado mesmo em um projeto hipotético executado por humanos perfeitos, que
nunca erram uma letra, nunca esquecem de *commitar* arquivos, nunca cometem deslizes
em uma refatoração. O propósito de um *commit* é documentar um passo atômico no
processo pelo qual o código evolui de um estado a outro. O propósito de um *changelog*
é documentar as diferenças relevantes entre esses estados.
A mesma diferença que existe entre bons comentários e o código em si existe entre o
*changelog* e o *commit log*: um descreve o *porquê*, o outro descreve o *como*.
### Podem os *changelogs* ser automaticamente interpretados?
É difícil, porque as pessoas seguem formatos e nomes de arquivos
radicalmente diferentes.
[Vandamme][vandamme] é uma gem criada pelo time [Gemnasium][gemnasium] que
interpreta muitos (mas não todos) *changelogs* de projetos *open source*.
### Por que você alterna entre as grafias "CHANGELOG" e "changelog"?
"CHANGELOG" é o nome do arquivo em si. É um pouco chamativo mas é uma
convenção histórica seguida por muitos projetos *open source*. Outros exemplos
similares de arquivo incluem [`README`][README], [`LICENSE`][LICENSE], e
[`CONTRIBUTING`][CONTRIBUTING].
O nome em letras maiúsculas (o que em sistemas operacionais antigos faziam
estes arquivos ficarem no topo da lista) é utilizado para chamar atenção.
Por conterem importantes metadados do projeto, *changelogs* são úteis a
qualquer um que pretenda utilizar ou contribuir com o projeto, da maneira
equivalente às [badges de projetos *open source*][shields].
Quando eu me refiro a "*changelog*", eu estou falando sobre a função desse
arquivo: listar mudanças.
### E sobre as publicações removidas?
Publicações removidas são versões que tiveram que ser removidas devido a um
sério bug ou problema de segurança. Com frequência essas versões sequer
aparecem em *changelogs*. Deveriam. É assim que você deve exibi-las:
`## [0.0.5] - 2014-12-13 [YANKED]`
A tag `[YANKED]`/`[REMOVIDA]` é chamativa por uma razão. É importante que
as pessoas a notem. Além disso, já que é cercada por colchetes, é mais
fácil detectá-la programaticamente.
### Devemos alterar o *changelog* em alguma circunstância?
Claro. Sempre existem bons motivos para melhorar um *changelog*. Eu regularmente
abro *pull requests* para adicionar versões faltantes em projetos *open source*
com *changelogs* abandonados.
Também é possível que você perceba que se esqueceu de registrar mudanças
importantes nas notas de uma versão. É obviamente importante que você atualize
seu *changelog* nesse caso.
### Como eu posso contribuir?
Este documento não é a verdade; é minha cuidadosa opinião, junto com as
informações e exemplos que reuni. Embora eu tenha providenciado um
[CHANGELOG][] no [repositório no GitHub][gh], eu não criei de propósito uma
lista clara de regras a serem seguidas (como o [SemVer.org][semver] faz, por
exemplo).
Fiz isso porque eu gostaria que nossa comunidade chegasse a um consenso. Eu
acredito que a discussão é tão importante quanto o resultado final.
Então, por favor, [entre em campo][gh].
[CHANGELOG]: https://github.com/olivierlacan/keep-a-changelog/blob/main/CHANGELOG.md
[CONTRIBUTING]: https://github.com/olivierlacan/keep-a-changelog/blob/main/CONTRIBUTING.md
[LICENSE]: https://github.com/olivierlacan/keep-a-changelog/blob/main/LICENSE
[README]: https://github.com/olivierlacan/keep-a-changelog/blob/main/README.md
[gemnasium]: https://gemnasium.com/
[gh]: https://github.com/olivierlacan/keep-a-changelog
[issues]: https://github.com/olivierlacan/keep-a-changelog/issues
[semver]: https://semver.org/
[shields]: https://shields.io/
[thechangelog]: https://changelog.com/podcast/127
[vandamme]: https://github.com/tech-angels/vandamme/