Semantic Versioning com npm

Se há uma coisa incrível nos pacotes Node.js, é que todos eles permitem utilizar Versionamento Semântico em suas numerações de versão.

O Versionamento Semântico é um conceito simples: todas versões têm 3 digitos: x.y.z.

  • o primeiro digito é a versão major
  • o segundo digito é a versão minor
  • o terceiro digito é a versão patch

Quando você cria uma nova versão, você não aumenta um número como bem entender, existem algumas regras:

  • você aumenta a versão major quando você cria mudanças de API incompatíveis
  • você aumenta a versão minor quando você adiciona uma funcionalidade compatível com versões anteriores
  • você aumenta a versão patch quando você arruma bugs sem quebrar versões anteriores

Essa convenção é adotada em todas linguagens de programação, e é muito importante que todo pacote npm a siga, pois o sistema como um todo depende disso.

Por que isso é tão importante?

Porque o npm define algumas regras que podemos usar no package.json para escolher quais versões podem ser atualizadas ao rodar npm update.

As regras utilizam esses símbolos:

  • ^
  • ~
  • >
  • >=
  • <
  • <=
  • =
  • -
  • ||

Vamos ver essas regras em detalhes:

  • ^: Só vai fazer atualizações que não alterem o número mais a esquerda diferente de zero. Se você definir ^0.13.0, ao rodar npm update, ele pode atualizar para 0.13.1, 0.13.2, e assim por diante, mas não para 0.14.0 ou posteriores. Se você definir ^1.13.0, ao rodar npm update, ele pode atualizar para 1.13.1, 1.14.0 e assim por diante, mas não para 2.0.0 ou posterior.
  • ~: se você definir ~0.13.0, ao rodar npm update ele pode atualizar para versões patch: 0.13.1 está ok, mas 0.14.0 não está.
  • >: aceita qualquer versão maior que a especificada
  • >=: aceita qualquer versão maior ou igual a especificada
  • <=: aceita qualquer versão menor ou igual a especificada
  • <: aceita qualquer versão menor que a especificada
  • =: aceita aquela exata versão
  • -: aceita qualquer versão dentro de um intervalo. Exemplo: 2.1.0 - 2.6.2
  • ||: combina restrições. Exemplo: < 2.1 || > 2.6

Você pode combinar algumas dessas notações, por exemplo, utilize 1.0.0 || >=1.1.0 <1.2.0 para usar 1.0.0 ou uma versão maior ou igual a 1.1.0, porém menor que 1.2.0.

Também há outras regras:

  • sem símbolo: aceita apenas a versão especificada (1.2.1)
  • latest: usa a versão mais recente disponível