Versão e compatibilidade
Semver na prática: o que cada número promete, como o resolvedor lê a faixa, e por que conflito é erro.
A versão de uma biblioteca é uma promessa legível por máquina. Ela responde a uma pergunta só: posso atualizar sem ler o changelog?
1.4.2
│ │ └── correção — consertou algo, sem mudar o contrato
│ └──── menor — acrescentou algo, sem quebrar o que havia
└────── maior — quebrou alguma coisaO que cabe em cada número#
| Mudança | Sobe |
|---|---|
| corrigir um cálculo errado | correção (1.4.2 → 1.4.3) |
| melhorar a mensagem de um erro | correção |
| trocar a implementação interna | correção |
acrescentar uma ação ao relay | menor (1.4.2 → 1.5.0) |
| acrescentar um parâmetro com padrão | menor |
| acrescentar um campo com padrão a um record | menor |
| renomear ou remover algo público | maior (1.4.2 → 2.0.0) |
| trocar o tipo de um erro levantado | maior |
| tornar obrigatório um parâmetro que era opcional | maior |
| mudar o que uma ação devolve | maior |
A faixa, do lado de quem depende#
[dependencies]
validador = "^1.2.0" # >=1.2.0 e <2.0.0 — aceita correção e menor
tabela = "~1.2.0" # >=1.2.0 e <1.3.0 — só correção
datas = "1.2.3" # exatamente essa
cofre = ">=1.0 <3.0" # comparadores, combináveis
texto = "*" # qualquer uma
^ é o padrão razoável: ele confia no semver de quem publicou. ~ é para quando essa confiança ainda não existe, e a versão exata é para quando existe um motivo escrito.
Antes de 1.0.0#
Enquanto o maior é 0, o contrato ainda está sendo decidido, e a convenção é que o menor carrega as quebras: 0.3.0 pode quebrar 0.2.0. Publicar 1.0.0 é a declaração de que o contrato está de pé — e é a partir dali que ele custa caro para mudar.
Conflito é erro, e não aviso#
Se dois pacotes pedem faixas incompatíveis do mesmo terceiro, dataforge install falha, dizendo quem pediu o quê. A alternativa — instalar duas cópias em versões diferentes — produz o pior tipo de bug: dois record com o mesmo nome e campos distintos circulando no mesmo programa, e um with que recusa o próprio resultado.
O lockfile#
| Arquivo | Guarda | Versionar? |
|---|---|---|
forge.toml | o que você pediu (faixas) | sim |
forge.lock | o que foi instalado (versões exatas + sha256) | sim |
forge_modules/ | os arquivos | não |
O lock é o que faz a instalação de hoje ser igual à de três meses atrás — e o sha256 é o que faz "a mesma versão" significar "os mesmos bytes".