𝗣𝗮𝗰𝗸𝗮𝗴𝗲.𝗷𝘀𝗼𝗻 dhidi ya 𝗚𝗼.𝗺𝗼𝗱: 𝗜𝗹𝗶𝗸𝘂𝗮 𝗶𝗸apotea wapi?
Ukihamia kutoka JavaScript kwenda Go, jambo moja litakushangaza.
Katika faili la package.json, toleo (version) lipo juu kabisa. Unaweza kulisoma. Unaweza kulibadilisha kwenye pull request. Unaweza kulitafuta. Ni ukweli unaoishi ndani ya kodi yako.
Sasa fungua faili la go.mod. Toleo halipo hapo.
Hili si kosa. Ni chaguo.
Go haitumii uwanja wa toleo (version field) kwa ajili ya moduli yako. Badala yake, Go hutumia git tags.
Ili kuweka toleo katika Go, unafanya hivi:
- git tag v1.2.3
- git push origin v1.2.3
Git tag ndiyo chanzo pekee cha ukweli (single source of truth). Mtu anapokimbiza go get, Go huangalia tag za ghala (repository) yako ili kupata commit sahihi.
Muundo huu una nguvu kubwa. Toleo haliwezi kamwe kuashiria kodi isiyo sahihi. Katika npm, kodi iliyochapishwa na chanzo kilichowekewa tag vinaweza kutengana. Katika Go, ni kitu kimoja kwa sababu toleo ni kiashiria (pointer) cha commit.
Hata hivyo, hili linabadilisha mtiririko wako wa kazi (workflow) kwa njia kadhaa:
- Kupata toleo lako kunahitaji amri (command). Lazima ukimbize
git describe --tagsbadala ya kutazama faili. - Marekebisho ya toleo (version bumps) hayaonekani kwenye mapitio ya kodi (code reviews). Kusukuma tag (tag push) si mabadiliko ya kodi, hivyo haionekani kwenye pull request.
- Majengo ya ndani (local builds) hutumia pseudo-versions. Mpaka utakapoweka tag kwenye commit, utaona mfululizo mrefu wa namba na hash badala ya toleo safi kama v1.2.3.
- Matoleo makuu (major versions) hubadilisha njia yako ya kuingiza (import path). Katika npm, unabadilisha namba ya toleo lakini unabaki na jina la kifurushi (package name). Katika Go, v2 na zaidi zinahitaji mabadiliko ya njia kama /v2. Hii inaruhusu programu kutumia v1 na v2 za maktaba (library) ile ile kwa wakati mmoja bila migongano.
Mifumo mingine mingi huweka toleo kwenye faili:
- Node: package.json
- Rust: Cargo.toml
- Python: pyproject.toml
- Java: pom.xml
- .NET: .csproj
Go ni tofauti. Inategemea git tags pekee.
Ikiwa unataka binary yako ya Go ionyeshe toleo safi, unaweza kuliingiza wakati wa mchakato wa kujenga (build process) kwa kutumia ldflags. Watengenezaji wengi pia hutumia zana kama goreleaser ili kuwezesha mchakato wa tag na toleo (release) kiotomatiki.
Mifano hii miwili inawakilisha vipaumbele tofauti:
- Matoleo yanayotokana na faili ni rahisi kusoma na kupitia. Hatari ni kwamba faili linaweza kutengana na kodi halisi.
- Matoleo yanayotokana na tag hayawezi kughushiwa. Gharama yake ni kwamba ni vigumu kuyaona na kuyasimamia.
Go ilichagua mfano wa tag ili kuhakikisha kuwa manifest kila wakati inalingana na kodi.
Kwa wale wanaotoa kodi ya Go: Unaonaje mfumo wa kutumia lebo pekee (tag-only model) katika kazi yako ya kila siku? Je, ungeubadilisha?
Chanzo: https://dev.to/dalirnet/packagejson-vs-gomod-where-did-the-version-field-go-3301