Martin Michálek Martin Michálek  – 1. 11. 2018

SemVer je specifikace, jejímž cílem je sjednocení způsobu verzování software.

Autorům prostě předepisuje, jakým způsobem označovat nové verze jejich programů.

Major.Minor.Patch

Vezměme, že software vyjde v této verzi:

1.2.3

(…a že autoři dodržují SemVer, což není úplná samozřejmost.)

Major: 1.y.z

První číslovka je určená pro major verze, které mohou do software přinášet zlomové změny – v našem příkladu je to číslo 1 na první pozici.

Specifikace ale mluví o výjimce pro verze začínající nulou: Major verze s hodnotou 0 (0.y.z) je určena pro počáteční vývoj. Cokoliv se může změnit a API v tomto formátu by nemělo být považováno za stabilní.

Minor: x.2.z

Číslovka za tečkou označuje minor verzi. Ta může přinášet tyto změny:

  • přidání zpětně kompatibilní funkcionality,
  • odebrání funkcionality (jako zastaralé) i pokud neovlivňuje samotný API kód.

Jde prostě o změny, které jsou z pohledu uživatele programu zpětně kompatibilní. V příkladu nahoře je to číslovka 2 na druhé pozici.

Patch: x.y.3

Třetí číslovka je patch. Ta se mění při opravách chyb. V ukázce výše je to číslovka 3 na třetí pozici.

Nicmoc složitého na tom není. Specifikace je v českém překladu dostupná zde: semver.org/lang/cs/

Protože jsme ale na blogu, který se věnuje převážně webového frontendovému vývoji, musíme se podívat, jaký má SemVer vliv na vyžadování verzí v konfiguraci NPMpackage.json.

SemVer a package.json

Vytáhněme si kousek tohoto konfiguračního souboru:

"dependencies": {
  "bootstrap": "^4.1.3",
  "jquery": "~3.3.1",
  "popper.js": "1.14.4"
}

Speciálními znaky u čísel verzí říkám, jakým způsobem je dovoleno tyhle balíčky aktualizovat (např. při vyžádání pomocí npm install):

  • ^ – stříška (caret) umožňuje stahovat libovolné „minor“ verze. Zde u Bootstrapu klidně stáhne verzi 4.2.0, ale už ne třeba 5.0.0.
  • ~ – vlnovka (tilde) stahuje jen nové „patch“ verze. Takže jsme NPM dovolili stáhnout například verzi 3.3.11, ale už ne 3.4.0.
  • Bez speciálních znaků uvedená verze u Popper.js znamená: Chci přesně tuhle verzi a basta.

U běžných frontendových balíčků je možné dávat stříšku. Pokud ten software dobře neznáte nebo chcete být opatrní, pak doporučuji vlnovku.

Existují zde ale i další možnosti:

  • latest – chcete vždycky poslední verzi tohoto software.
  • * – balíček se aktualizuje zcela libovolně, nezáleží vám na verzi. To samé udělá prázdná definice, např. "bootstrap": "".
  • >, < – větší než, menší než. Možné je i „větší nebo rovno“ a tak dále. Nebo rozmezí: ">=1.2.7 <1.3.0".
  • 1.2.x – stejné jako vlnovka. Aktualizuje se jen patch verze.

Více možností a příkladů je v dokumentaci NPM: docs.npmjs.com/files/package.json

SemVer v NPM

Výchozí typ závislostí je stříška, tedy možnost aktualizace minor verzí: ^4.1.3.

Pár užitečných příkazů:

  • npm update nebo npm install stáhne nové verze podle deklarace v package.json.
  • npm outdated zobrazí seznam dostupných aktualizací. Velmi užitečné.
  • npm install <balicek>@1.2.3 stáhne a uloží balíček ve specifikované verzi.
  • npm install <balicek> --save-exact stáhne a uloží balíček. Do package.json jej vloží v přesné verzi, např. "balicek": "1.12.1".
  • npm config set save-prefix '~' změní výchozí specifikaci závislostí ze stříšky na vlnovku. Pokud k tomu nemáte silné důvody, rozhodně nedoporučuji dělat.