Tarkibga o'tish

Tashqi kutubxonalar va dependency management

Go bilan birga fmt, strings, net/http kabi standart paketlar o‘rnatiladi. Lekin real loyihada standart kutubxonada yo‘q imkoniyat ham kerak bo‘lishi mumkin. Bunday paytda boshqa modul taqdim etgan tashqi paketdan foydalanamiz.

Tashqi kod loyihaga bog‘liqlik (dependency) bo‘lib kiradi. Dependency management — shu kodning versiyasini tanlash, yuklash, yangilash va buildlarda bir xil qolishini boshqarish jarayoni.

Paket, modul va kutubxona

Bu atamalar bir-biriga yaqin, ammo vazifasi boshqa:

  • paket (package) — odatda bitta katalogdagi, bir xil package nomiga ega Go fayllari;
  • modul (module)go.mod fayli bilan belgilangan va bir yoki bir nechta paketni o‘z ichiga oladigan versiyalanadigan birlik;
  • kutubxona (library) — qayta ishlatish uchun yozilgan kodning umumiy nomi. Go buyruqlari asosan paket va modul atamalarini ishlatadi.

Masalan, github.com/google/uuid bir vaqtning o‘zida modul yo‘li va uning ildiz paketining import yo‘lidir. Kattaroq modulda esa example.com/project/client kabi bir nechta paket bo‘lishi mumkin.

Go paketlari bitta markaziy bazada saqlanmaydi. Ularning hujjatlarini pkg.go.dev orqali qidirish mumkin, manba kodi esa modul yo‘li ko‘rsatgan Git repozitoriyda joylashadi.

Tashqi paket nima uchun kerak?

Tashqi paket tayyor va sinovdan o‘tgan yechimdan qayta foydalanish imkonini beradi. Masalan, UUID yaratish, ma’lumotlar bazasi drayveri yoki ma’lum bir protokol bilan ishlash uchun paket tanlash mumkin.

Har bir dependency bilan birga mas’uliyat ham keladi:

  • API yangi versiyada o‘zgarishi mumkin;
  • dependency o‘z navbatida boshqa modullarga bog‘liq bo‘lishi mumkin;
  • litsenziya loyiha talablariga mos kelmasligi mumkin;
  • xato yoki xavfsizlik muammosi sizning dasturingizga ham ta’sir qiladi.

Shuning uchun avval masalani standart kutubxona hal qila olishini tekshiring. Tashqi paket kerak bo‘lsa, uning hujjati, litsenziyasi, yangilanish holati va API barqarorligini ko‘rib chiqing.

Loyihani tayyorlash

Tashqi dependency modul ichida boshqariladi. Yangi katalog yaratib, modulni boshlaymiz:

mkdir uuid-demo
cd uuid-demo
go mod init example.com/uuid-demo

example.com/uuid-demo — modul yo‘li. Faqat lokal mashq uchun bu nom ishlaydi. Ochiq repozitoriyga joylanadigan modulda odatda kodning haqiqiy manzili, masalan, github.com/foydalanuvchi/uuid-demo yoziladi.

Buyruq go.mod faylini yaratadi:

go.mod
module example.com/uuid-demo

go 1.xx

go direktivasidagi qiymat o‘rnatilgan toolchain va loyiha sozlamasiga bog‘liq. Uni darsdagi qiymatga majburan almashtirish shart emas. Modullar keyingi darsda batafsil ko‘rib chiqiladi.

Birinchi tashqi paket

UUID yaratish uchun github.com/google/uuid paketidan foydalanamiz. main.go faylini yarating:

main.go
package main

import (
    "fmt"

    "github.com/google/uuid"
)

func main() {
    id := uuid.New()
    fmt.Println("UUID:", id)
}

So‘ng dependencylarni loyiha fayllari bilan moslang va dasturni ishga tushiring:

go mod tidy
go run .

Natijadagi UUID har ishga tushirishda o‘zgaradi:

UUID: 550e8400-e29b-41d4-a716-446655440000

import paketning import yo‘lini bildiradi. uuid.New() yangi qiymat yaratadi. go mod tidy importlarni tahlil qilib, kerakli modulni go.modga qo‘shadi va kodni modul keshiga yuklaydi. Natijadagi aniq UUID tasodifiy bo‘lgani uchun namunadagi qiymat bilan bir xil chiqishi kutilmaydi.

Xuddi shu dependency aniq buyruq bilan ham qo‘shilishi mumkin:

go get github.com/google/uuid@latest

go get modul versiyasini tanlaydi yoki o‘zgartiradi. Paketni faqat kompyuterga “o‘rnatib qo‘yish” deb tushunish noto‘g‘ri: tanlangan versiya joriy modulning go.mod faylida qayd etiladi. Importlardan keyin go mod tidy ishlatish esa kundalik ish oqimida qulayroq.

Info

CLI dasturini o‘rnatish boshqa amal. Buning uchun go install example.com/cmd/tool@version ishlatiladi. go install joriy loyihaning go.mod fayliga dependency qo‘shmaydi.

Bevosita va bilvosita dependency

Sizning kodingiz to‘g‘ridan-to‘g‘ri import qilgan modul bevosita dependency hisoblanadi. U ishlatadigan boshqa modul esa bilvosita dependency (indirect dependency) bo‘lishi mumkin.

Ularni ko‘rish uchun:

go list -m all

Bilvosita dependencylarni qo‘lda o‘chirib tashlash kerak emas. go mod tidy paket importlari va modul grafigiga qarab kerakli yozuvlarni boshqaradi.

Versiyani tanlash va yangilash

Aniq versiya takrorlanuvchi build uchun muhim:

go get github.com/google/[email protected]

Bu yerda versiya faqat buyruq shaklini ko‘rsatish uchun berilgan. Amaliy loyihada kerakli versiyani paketning relizlari va o‘zgarishlar ro‘yxatidan tanlang.

Asosiy buyruqlar:

go list -m -u all
go get example.com/[email protected]
go get example.com/modul@latest
go mod tidy

go list -m -u all mavjud yangilanishlarni ko‘rsatadi. @latest eng yangi mavjud mos versiyani tanlashni so‘raydi, lekin yangilanish API mosligini kafolatlamaydi. Dependency yangilangach testlar va buildni qayta ishlating.

Semantic Versioning bo‘yicha v1.4.0dan v1.5.0ga o‘tish odatda mos bo‘lishi kutiladi. v2 esa katta, mos kelmaydigan o‘zgarish bo‘lishi mumkin. Go modullarida v2 va undan keyingi asosiy versiya ko‘pincha import yo‘liga ham qo‘shiladi:

import "example.com/lib/v2"

go.mod va go.sum

go.mod modul yo‘li, Go direktivasi va tanlangan dependency versiyalarini saqlaydi. go.sum esa yuklangan modul fayllari uchun kriptografik nazorat summalarini saqlaydi.

go.sum:

  • dependency kodi xavfsiz yoki xatosiz ekanini isbotlamaydi;
  • barcha yozuvlar bevosita import qilinayotganini anglatmaydi;
  • oldin olingan modul kontenti keyin o‘zgarmaganini tekshirishga yordam beradi.

go.mod va go.sum fayllarini odatda Git’ga commit qilish kerak. Modul keshi esa lokal keshdir; uni repozitoriyga qo‘shilmaydi.

Keng tarqalgan xatolar

Modul yaratmasdan go get ishlatish

Dependency loyiha kontekstida boshqarilishi uchun avval go mod init bilan modul yarating. Mavjud loyihada esa yuqori kataloglardan birida go.mod borligini tekshiring:

go env GOMOD

Import yo‘li o‘rniga repozitoriy sahifasini yozish

Import yo‘lini paket hujjatidan oling. Modul repozitori ichidagi har bir katalog import qilinadigan paket bo‘lavermaydi.

go.sumni o‘chirib muammoni yashirish

Checksum xatosi bo‘lsa, faylni ko‘r-ko‘rona o‘chirmang. Modul manbasi, proxy sozlamasi va versiya o‘zgarmaganini tekshiring. Xato dependency kontenti kutilmaganda o‘zgarganini ko‘rsatishi mumkin.

Dependency yangilanishini tekshirmaslik

Yangi versiya kompilyatsiyadan o‘tsa ham xatti-harakat o‘zgargan bo‘lishi mumkin. Changelogni o‘qing, testlarni va go vet ./... kabi loyiha tekshiruvlarini bajaring.

Xulosa

Tashqi paket tayyor koddan foydalanishga yordam beradi, lekin uning versiyasi va xavfi ham loyiha tarkibiga kiradi. Paketni hujjati va litsenziyasiga qarab tanlang, dependencylarni go.mod va go.sum orqali qayd eting, yangilanishni esa test bilan tekshiring. Keyingi darslarda Go dokumentatsiyasi va test yozishni ko‘ramiz.