Dependency — bir dasturiy komponent ishlashi, build qilinishi yoki testdan o‘tishi uchun tayanadigan boshqa komponent, xizmat yoki resurs.
Dependency library, package, runtime, database, API, compiler, operatsion tizim yoki configuration bo‘lishi mumkin.
Dependency tizimlar orasida bog‘lanish yaratadi. Bu qayta foydalanishni oshiradi, ammo versiya, xavfsizlik va mavjudlik risklarini ham olib keladi.
Direct dependency
Loyiha manifestida bevosita ko‘rsatilgan package direct dependency.
Masalan, application HTTP client libraryni to‘g‘ridan-to‘g‘ri import qiladi.
Developer uning API va versiya constraintini nazorat qiladi.
Transitive dependency
Direct dependency o‘zi boshqa package’ga tayanadi.
Bu transitive dependency.
Application uni source’da import qilmasligi mumkin, ammo:
ga ta’sir qiladi.
Dependency tree butun graph bilan tahlil qilinadi.
Build dependency
Faqat build jarayonida kerak:
Production artifact ichiga kirmasligi mumkin.
Build dependency ham supply-chain code execution huquqiga ega bo‘lishi mumkin.
Runtime dependency
Dastur bajarilganda kerak:
Build muvaffaqiyatli bo‘lsa ham runtime dependency yo‘q bo‘lsa dastur ishlamaydi.
Optional dependency
Ma’lum feature uchun kerak, asosiy ish uchun shart emas.
Package manager optional dependency o‘rnatilmasa package ishlashda davom etishini nazarda tutishi mumkin.
Kod feature mavjudligini tekshiradi.
Peer dependency
Ba’zi ekotizimda plugin host applicationdan ma’lum package versiyasini taqdim etishni kutadi.
Bu bir libraryning ikki nusxasi yuklanishini oldini olishi mumkin.
Peer constraint mos kelmasa install warning yoki xato beradi.
Development dependency
Test, lint, documentation va local development uchun kerak.
Production deploymentda olib tashlanishi mumkin.
Biroq server runtime’da migration yoki build bajarilsa ayrim development tool amalda kerak bo‘lib qolishi mumkin.
Dependency graph
Componentlar directed graph hosil qiladi.
Application
├── Library A
│ └── Library C
└── Library B
└── Library C
Resolver C uchun barcha constraintlarga mos version tanlaydi.
Graphda cycle package yoki module darajasida muammo tug‘dirishi mumkin.
Version constraint
Dependency versiyasi:
bilan belgilanadi.
Juda keng constraint kutilmagan breaking update, juda tor constraint update va security patchni qiyinlashtiradi.
Lock file
Resolver tanlagan aniq versiyalar lock file’da saqlanadi.
U:
ni beradi.
Manifest va lock file birga ishlaydi.
Diamond dependency
A va B bir xil C dependency’ning turli versiyasini talab qiladi.
- bitta umumiy version;
- ikki nusxa;
- conflict;
- nearest version
siyosatidan foydalanishi mumkin.
Native libraryda ikki ABI versiyani bir processga yuklash murakkab.
Dependency injection
Object o‘z dependency’sini ichkarida yaratmay, tashqaridan qabul qiladi.
OrderService(PaymentGateway gateway)
Bu:
- test;
- configuration;
- implementation almashtirish;
- lifecycle
ni soddalashtiradi.
Dependency injection package dependency managementdan boshqa darajadagi tushuncha.
Inversion of Control container
Container constructor va registration asosida object graph yaratadi.
U:
- singleton;
- scoped;
- transient;
- factory;
- disposal
lifecycle’larini boshqarishi mumkin.
Yashirin service locator dependency’ni code signature’dan yo‘qotadi.
External service dependency
Microservice boshqa service’ga tayanadi.
Bu dependency:
- network latency;
- timeout;
- partial failure;
- rate limit;
- authentication;
- version
ga ega.
Retry va circuit breaker barcha operatsiya uchun avtomatik to‘g‘ri emas.
Temporal coupling
Componentlar ma’lum tartibda ishga tushishi yoki chaqirilishi kerak bo‘lsa temporal dependency mavjud.
Masalan:
- config yuklash;
- connection ochish;
- query bajarish;
- close.
API state machine yoki lifecycle orqali tartibni aniq qiladi.
Dependency pinning
Aniq version yoki commit pin qilinadi.
Afzalligi — reproducibility.
Kamchiligi — eski security patchda qolish.
Avtomatik update bot yangi versiyani test bilan taklif qilishi mumkin.
Vendoring
Dependency source yoki binary nusxasi repository ichiga olinadi.
Afzalliklari:
Kamchiliklari:
- update qo‘lda;
- repository hajmi;
- upstream o‘zgarishdan uzilish;
- license tracking.
Supply-chain xavfi
Dependency install yoki build paytida code bajarishi mumkin.
Xavflar:
- account takeover;
- zararli release;
- typosquatting;
- dependency confusion;
- compromised build;
- hijacked domain;
- unsigned artifact.
Himoya ko‘p qatlamli bo‘ladi.
SBOM
Software Bill of Materials artifact ichidagi component va versionlar ro‘yxati.
Security hodisasida qaysi tizim zaif dependency ishlatayotganini topishga yordam beradi.
SBOM mavjudligi dependency xavfsizligini o‘zi kafolatlamaydi.
License dependency
Transitive package litsenziyasi application tarqatish shartlariga ta’sir qilishi mumkin.
License scanner:
- copyleft;
- attribution;
- proprietary cheklov;
- dual license
ni aniqlaydi.
Huquqiy talqin alohida ekspertiza talab qilishi mumkin.
Dependency reduction
Har dependency qo‘shimcha:
- code;
- vulnerability;
- update;
- build;
- license;
- API
yukini olib keladi.
Kichik umumiy amal uchun katta package qo‘shishdan oldin haqiqiy qiymat baholanadi.
Biroq muhim cryptography kabi sohani qayta yozish ham xavfli.
Update
Dependency update’da:
tekshiriladi.
Major update alohida bosqichda, patch update avtomatikroq jarayonda bajarilishi mumkin.
Diagnostika
Dependency muammosida:
- direct yoki transitive;
- resolved version;
- lock file;
- registry;
- duplicate;
- ABI;
- runtime path;
- optional feature;
- service availability;
- license;
- security advisory
tekshiriladi.
Error ko‘rsatayotgan package asl sabab bo‘lgan yuqoriroq dependency orqali kelgan bo‘lishi mumkin.
Bog‘liq tushunchalar
Direct dependency, Transitive dependency, Package manager, Lock file, Dependency injection, Version constraint, SBOM, Supply chain, Library, Runtime dependency