Sémantické, romantické a jiné verzování

5 PHP, Git, Tipy & triky

Sémantické verzování je způsob, jakým verzovat software tak, aby bylo možné jej správně používat v balíčkovacích nástrojích. Jenže jej hodně vývojářů nepoužívá, i když to tak na první pohled vypadá. Existují totiž i jiné metody.

Sémantické verzování

Téměř každý vyvíjený software je nějakým způsobem verzován. Pokud se jedná o balíčky nebo knihovny, je verzování naprostou nezbytností, protože balíčkovací nástroje na základě těchto dat stahují požadované verze. Jenže na otázku, jak správně určovat verze neexistuje jednoznačně správná odpověď.

Různé typy verzování

Můj názor: Pravděpodobně nejznámější verzování je sémantické, které je znázorněno v titulním obrázku. Jenže z mého pohledu se nejedná o nejrozšířenější metodu, i když pro zběžný pohled to tak může vypadat. Mnohem častější je podle mě verzování romantické. To používá jiný způsob verzí, který nemusí být nutně špatně, ale u balíčků je (si myslím).

Sémantické verzování

Přesnou definici dokonce i v češtině lze nalézt na webu semver.org, kde je i jasně definováno, která verze předchází které. Definici verzování navrhl Tom Preston-Werner, který se podílel mimo jiné na vzniku GitHubu.

Jednoduše lze říci, že číslo majoritní verze je nutné zvednout pokaždé, když je nová změna zpětně nekompatibilní s verzí předchozí. Pokud je k aktuální verzi přidána pouze nová funkcionalita, která neovlivňuje ostatní chování, stačí zvednout minoritní verzi. Stejně tak, pokud je nějaká část projektu označena jako deprecated. Pokud se jedná pouze o opravu chyb a žádná funkce se nepřidává ani nemaže, zvedá se pouze patch verze.

Pre-release případně další metadata slouží k určení dodatečných informací. Například, v jaké fázi se nachází alpha či beta verze. Tato část je sice nepovinná, co se týče jejího formátu jsou zde ale opět striktně definovaná pravidla.

Romantické verzování

Romantické verzování je přímo odvozené od sémantického a jeho definici lze nalézt na legacyteam.info a je znázorněno na obrázku níže. Jeho základní rozdíl oproti sémantickému verzování spočívá v přidání human verze a ve sjednocení minor a patch verze do jediného identifikátoru. Způsob zvedání jednotlivých verzí se pak neliší příliš od sémantického verzování. 

Zpětně kompatibilní oprava chyby nebo přidání nové zpětně kompatibilní funkcionality zvyšuje verzi minor/patch. Nová zpětně nekompatibilní změna zvyšuje major verzi. Human verze by se měla zvyšovat při zpětně nekompatibilní konceptuální změně.

Romantické verzování

Jak z toho ven?

V super článku Semantic versioning vs Romantic versioning je krásně popsáno, kdy by se měly používat jaké verze. Pokud se jedná o výsledný produkt, aplikaci nebo web, lze použít romantické verzování. Pokud se jedná o framework, knihovnu, operační systém nebo programovací jazyk apod. je vhodné použít sémantické verzování.

Většina balíčkovacích nástrojů jako je Composer, npm a další dokáží definovat rozsah pro různé typy verzování. Přeci jen sémantické se ale hodí více. Přesto nelze říci, že je dodržováno. Stačí se podívat na PHP kde mezi verzi 5.3 a 5.4 byly velké zpětně nekompatibilní změny, tudíž je zde použito romantické verzování. Stejně tak třeba u Laravelu. V tomo článku je i zmíněno, že jeden z hlavních programátorů Laravelu Graham Campbell ve svých balíčcích přesně definuje human a major verzi.

"require": {
    "php": "^7.1.3",
    "illuminate/contracts": "5.5.*|5.6.*|5.7.*|5.8.*",
    "illuminate/support": "5.5.*|5.6.*|5.7.*|5.8.*",
    "illuminate/view": "5.5.*|5.6.*|5.7.*|5.8.*",
    "league/commonmark": "^0.18"
},

Takže výsledná rada? Asi je jedno, které verzování je použito, pokud je řádně dodržováno a řečeno všem. A aby bylo jasno, i sémantické verzování je používáno, třeba u Bootstrapu.


A jaké verze používáte vy? Podělte se s ostatními čtenáři v komentářích

K tomuto článku již není možné přidávat další komentáře

Komentáře

O romantickém verzování slyším poprvé. A sjednocení minor / patch mi přijde jako ultra blbost, není důvod používat nic jiného než zavedené sémantické, přesto bylo užitečné se o tom dozvědět a zas to můžu zapomenout :-)

Myslím si, že zapomenout se nesmí. A proč? Protože jak píšu, romantické verzování využívá například Laravel, PHP (5.3 -> 5.4), Node.js, jQuery(v1.4 - v1.6) a výčet by mohl pokračovat dále a dále.

Z čeho poznáte, že jQuery používá romantické verzování?
Viz https://code.jquery.com/jquery/ mezi v1.4 a v1.5 a 1.6 jsou normální skoky a zvyšování minor verze, díky nově přidaným funkcím.

Stačí se podívat zde: http://blog.jquery.com/2011/05/03/jquery-16-released/ kde je celý nadpis "Breaking Changes"

A to stejné u verze 1.7 http://blog.jquery.com/2011/11/03/jquery-1-7-released/ kde je nadpis Removed features

Jedná z největších změn, které si pamatuji, byly ve funkci attr() a prop() u verze 1.6.*: http://api.jquery.com/attr/ stačí se podívat na tabulku

OK, u důležitých knihoven čtu co se změnilo / přidalo / upravilo. Jak jsem psal, o romantickém verzování čtu poprvé a přijde mi trošku neštastné, protože člověk, který zná a ví jak funguje sémantické (což je řekl bych nejrozšířenější, vlastně ani další jiné neznám, ta se pak nestačí divit, viz Vámi odkázaný příklad mezi verzí JQ 1.6 a 1.7).