npm, Cargo, Composer na pip zote hutafsiri kifupi kilekile cha semver kwa njia tofauti, na ni mbili tu kati ya michanganuo kumi na tatu ya masafa (range expressions) niliyojaribu inayofanya kazi kwa namna inayofanana katika zote nne.
Niliandika programu za uchambuzi (parsers) tofauti kwa kila meneja, nikafuata maelezo yao rasmi, kisha nikajaribu kila masafa dhidi ya jedwali la namba kumi na tisa za toleo. Gridi ya 13 × 19 (seli 247) ilionyesha picha iliyovurugika: seli 17 tu zilitoa jibu lilelile la “ndiyo” au “hapana” kutoka kwa kila zana, na nyingi kati ya hizo 17 zilikuwa kukataa kwa kauli moja. Kwa kifupi, zana hizi zinakubaliana kwenye “hapana” mara nyingi zaidi kuliko kwenye “ndiyo”.
Kwa nini zana hizi zinatofautiana
Meneja zote nne zinadai kufuata Semantic Versioning, lakini kila moja inaongeza sheria zake za kifupi.
- Caret (^) na dot-x – npm inasaidia caret; pip inapuuza caret na dot-x. Hilo pekee linasababisha kutokubaliana katika seli 49 kati ya npm na pip.
- Toleo tupu (Bare versions) – Cargo inachukulia
1.2.3ya kawaida kama masafa ya caret, ikimaanisha “inayokubaliana na 1.x”. npm na Composer husoma mfululizo huo huo kama inayolingana sawia, ikikubali1.2.3pekee. - Tilde (~) – Tilde ya Cargo inafunga toleo la ndogo (minor) (
~1.2inalingana na1.2.*lakini si1.3.0). Tilde ya Composer inafunga toleo la kuu (major) (~1.2inalingana na1.*). Tafsiri hizi mbili zinatofautiana kwenye toleo lolote linalobadilisha sehemu ya ndogo (minor component).
Udhibiti wa matoleo ya awali (pre-release) unaongeza mshangao mwingine. Masafa kama ^1.2.3 hayajumuishi 2.0.0-rc.1, ingawa sehemu ya namba ni ndogo kuliko kikomo cha juu. Sheria: matoleo ya awali huondolewa isipokuwa kama masafa yanataja waziwazi utambulisho wa toleo la awali.
Sintaksia pekee salama inayoweza kutumika kwenye zana tofauti
Jaribio linaonyesha kuwa masafa ya kutokuwa sawa (inequality ranges) yaliyo wazi—kwa mfano >=1.2.0 <2.0.0—hufanya kazi kwa namna inayofanana katika npm, Cargo, Composer na pip. Kila meneja huchukulia mipaka hiyo miwili kama kikomo cha namba halisi, bila maana ya siri ya caret au tilde.
Ikiwa unahitaji kueleza “toleo lolote la 1.x ambalo ni angalau 1.2”, liandike kikamilifu. Inagharimu wahusika wachache zaidi wa herufi; inahakikisha utatuzi unaotabirika popote ambapo kodi inafanya kazi.
Wakati kifupi bado kina maana
Kifupi bado kina mvuto kwa miradi ya lugha moja. Ndani ya mfumo wa npm pekee, ^1.2.3 inatafsiri kwa ufupi “inayokubaliana na matoleo ya baadaye ya minor na patch”. Hali kadhalika kwa caret ya Cargo au tilde ya Composer unapojua kuwa zana inayotumia haitabadilika. Hatari hutokea wakati faili moja ya manifest inapotumiwa tena katika mipaka ya lugha tofauti, au wakati kazi ya CI inavuta utegemezi (dependencies) kutoka kwa mifumo mingi.
Hitimisho
Kutegemea kifupi cha semver kwa ajili ya utangamano wa lugha mbalimbali ni kamari. Njia pekee ya kuaminika ya kuhakikisha kuwa kizuizi cha toleo (version constraint) kina maana ileile kila mahali ni kuandika kutokuwa sawa (inequalities) kwa wazi. Unapohitaji ufupi, baki ndani ya mfumo mmoja; unapohitaji uthabiti, badala ya kifupi, tumia uwazi.
