Versões das dependências

Versionamento semântico

Pacotes no Yarn seguem Versionamento Semântico, também conhecido como “semver”. Quando você instala um novo pacote do registro, ele será adicionado em seu arquivo package.json com um intervalo de versão semver.

Essas versões são decompostas em major.minor.patch e parece com um desses: 3.14.1, 0.42.0, 2.7.18. Cada parte da versão é incrementada em vários momentos:

  • Incremente major quando você faz uma mudança que quebra ou torna incompatível a API de um pacote.
  • Incremente minor quando você adicionar novas funcionalidades enquanto permanece compatível com versões anteriores
  • Incremente minor quando você adicionar correções de erros enquanto permanece compatível com versões anteriores

Nota: Por vezes, há também “rótulos” ou “extensões” para o formato de semver que marcam coisas como versões pré-lançamento ou betas (por exemplo, 2.0.0-beta.3)

Quando os desenvolvedores falam sobre duas versões de semver sendo “compatíveis” uma com a outra, eles estão se referindo às mudanças compatível com versões anteriores (minor e patch).

Intervalos de versão

Quando você quer especificar uma dependência, especifique o nome e o intervalo de versão no seu arquivo package.json como um desses:

{
  "dependencies": {
    "package-1": ">=2.0.0 <3.1.4",
    "package-2": "^0.4.2",
    "package-3": "~2.7.1"
  }
}

Você notará que temos um monte de caracteres separados da versão. Esses caracteres, >=, <, ^, e ~, são operadores e são usados para especificar os intervalos de versão.

O propósito de um intervalo de versão é para especificar quais versões de uma dependência irão funcionar para o seu código.

Comparadores

Cada alcance de versão é composto de comparadores. Estes comparadores são simplesmente um operador seguido por uma versão. Aqui estão alguns dos operadores básicos:

Comparador Descrição
<2.0.0 Qualquer versão que seja menor que 2.0.0
<=3.1.4 Qualquer versão que seja menor ou igual a 3.1.4
>0.4.2 Qualquer versão que seja maior que 0.4.2
>=2.7.1 Qualquer versão que seja maior ou igual a 2.7.1
=4.6.6 Qualquer versão que seja igual a 4.6.6

Nota: se nenhum operador for especificado, então é assumido = no intervalo de versão. Então, o operador de = é efetivamente opcional.

Interseções

Comparadores podem ser unidos por espaço em branco para criar um conjunto de comparador. Isso cria uma interseção entre os comparadores inclusos. Por exemplo, o comparador >=2.0.0 <3.1.4 significa “Maior ou igual a 2.0.0 e menor que 3.1.4".

Uniões

Um intervalo de versão completo pode incluir uma união de vários conjuntos de comparadores unidos por ||. Se qualquer dos lados da união for satisfeito, então todo o intervalo de versão é satisfeito. Por exemplo, o intervalo de versão <2.0.0 || >3.1.4 significa “Menor que 2.0.0 ou maior que 3.1.4".

Tags de pré-lançamento

Versões também podem ter tags de pré-lançamento (ex. 3.1.4-beta.2). Se um comparador inclui uma versão com uma tag de pré-lançamento, só irá corresponder às versões que tenham a mesma versão major.minor.patch.

Por exemplo, o intervalo >=3.1.4-beta.2 corresponderia a 3.1.4-beta.2 ou 3.1.4-beta.12, mas não corresponderia a 3.1.5-beta.1, mesmo que seja tecnicamente “maior ou igual a” (>=) a versão de 3.1.4-beta.2.

Pré-lançamentos tendem a conter alterações que quebram o pacote, e normalmente você não quer corresponder com pré-lançamentos fora da versão que você especificou, então esse comportamento é útil.

Intervalos de versão avançados

Intervalos de Hífen

Intervalos de hífen (ex. 2.0.0 - 3.1.4) especificam um conjunto inclusivo. Se parte da versão é deixado de fora (ex. 0.4 ou 2), eles são preenchidos com zeros.

Intervalo de versão Intervalo de versão expandido
2.0.0 - 3.1.4 >=2.0.0 <=3.1.4
0.4 - 2 >=0.4.0 <=2.0.0
Intervalos-X

Qualquer um desses, X, x ou *, pode ser usado para deixar parte ou toda uma versão não especificada.

Intervalo de versão Intervalo de versão expandido
* >=0.0.0 (qualquer versão)
2.x >=2.0.0 <3.0.0 (corresponde com a versão major)
3.1.x >=3.1.0 <3.2.0 (corresponde com as versões major e minor)

Se parte de uma versão é omitido, presume-se ser um intervalo-x.

Intervalo de versão Intervalo de versão expandido
`` (string vazia) * or >=0.0.0
2 2.x.x ou >=2.0.0 <3.0.0
3.1 3.1.x ou >=3.1.0 <3.2.0
Intervalo de til (~)

Usar ~ com uma versão minor especificada permite alterações de patch. Usar ~ com versão major especificada permitirá mudanças minor.

Intervalo de versão Intervalo de versão expandido
~3.1.4 >=3.1.4 <3.2.0
~3.1 3.1.x ou >=3.1.0 <3.2.0
~3 3.x ou >=3.0.0 <4.0.0

Nota: Especificar pré-lançamentos em intervalos de til corresponderá somente pré-lançamentos na mesma versão completa. Por exemplo, o intervalo de versão ~3.1.4-beta.2 corresponderia com 3.1.4-beta.4 mas não com 3.1.5-beta.2 porque a versão major.minor.patch é diferente.

Intervalos de acento circunflexo

Permite alterações que não modificam o primeiro dígito diferente de zero na versão, tanto o 3 em 3.1.4 ou o 4 em 0.4.2.

Intervalo de versão Intervalo de versão expandido
^3.1.4 >=3.1.4 <4.0.0
^0.4.2 >=0.4.2 <0.5.0
^0.0.2 >=0.0.2 <0.0.3

Nota: Por padrão quando você executa yarn add [package-name] ele usará um intervalo de acento circunflexo.

Se parte da versão é deixado de fora, as partes que faltam são preenchidas com zeros. No entanto, eles ainda permitirão que esse valor seja alterado.

Intervalo de versão Intervalo de versão expandido
^0.0.x >=0.0.0 <0.1.0
^0.0 >=0.0.0 <0.1.0
^0.x >=0.0.0 <1.0.0
^0 >=0.0.0 <1.0.0

Mais recursos