Bosh sahifa Wiki Build graph

Build graph

Build graphbuild targetlar va ular orasidagi dependency munosabatlarini ifodalovchi yo‘naltirilgan grafdir. Node target yoki actionni, edge esa “A tayyor bo‘lishi uchun B kerak” bog‘lanishini ko‘rsatadi. Build tizimi shu graf orqali bajarish tartibi, parallelizm, incremental rebuild va cachedan foydalanishni aniqlaydi.

Graf tuzilishi

Source file leaf input bo‘lishi, object file compilation actiondan chiqishi, executable esa bir nechta object va libraryga bog‘lanishi mumkin. Directed edge dependencydan consumergacha yoki aksincha tasvirlanishi vositaga bog‘liq; semantika hujjatda aniq bo‘ladi.

Build graph odatda acyclic bo‘lishi kerak. A target Bga, B esa Aga tayanadigan cycle bajarish tartibini imkonsiz qiladi. Cycle ko‘pincha modul chegarasi noto‘g‘ri yoki umumiy interfeys alohida targetga ajratilishi kerakligini ko‘rsatadi.

Tahlil va yaratish

Ba’zi tizim graphni konfiguratsiya bosqichida to‘liq yaratadi. Boshqalari dynamic dependency yoki source scanning orqali bajarish davomida kengaytiradi. Dynamic graph moslashuvchan, lekin hermeticlik va oldindan schedulingni murakkablashtiradi.

Query vositasi targetning direct va transitive dependencylarini, reverse dependencylarini hamda pathni ko‘rsatadi. “Bu fayl o‘zgarsa nimalar rebuild bo‘ladi?” savoli reverse closure bilan javoblanadi. Graph visualization katta loyihadagi kutilmagan couplingni topishga yordam beradi.

Critical path

Mustaqil node’lar parallel bajarilsa ham eng uzun bog‘liq actionlar zanjiri umumiy minimal build vaqtini cheklaydi. Bu critical pathdir. Critical pathdagi sekin compile yoki code generationni optimallashtirish, ko‘p qisqa non-critical actionni tezlatishdan ko‘proq foyda berishi mumkin.

Scheduler resurs talablarini ham hisobga oladi. Xotirasi katta link actionini bir necha nusxada parallel ishga tushirish thrashing keltirishi mumkin. Node metadata CPU, memory va local-only talabini bildirib, real throughputni yaxshilaydi.

Incremental aniqlik

Input o‘zgarsa unga bog‘liq barcha downstream node invalid bo‘ladi. Dependency edge yetishmasa, target eski cache natijasini ishlatadi. Keraksiz edge esa to‘g‘ri, ammo ortiqcha rebuild keltiradi. Shu sabab graph correctness build correctnessning asosiy qismidir.

Content digest timestampga qaraganda ko‘chirish va clock farqiga kamroq bog‘liq. Action key command, toolchain, environment va barcha input digestlarini qamrab oladi. Remote cache turli workerda bir xil key uchun tayyor output beradi.

Arxitektura signali

Graphdagi juda yuqori fan-outga ega target ko‘p consumerga ta’sir qiladi. Uning public interfeysini tez-tez o‘zgartirish katta rebuild va migratsiya narxi yaratadi. Yuqori fan-in yoki chuqur dependency chain arxitektura review uchun signal bo‘lishi mumkin.

Layering qoidasi ayrim edge yo‘nalishlarini taqiqlaydi, masalan domain modulining UI implementationga bog‘lanmasligi. Build tizimi bu siyosatni query yoki visibility bilan majburiy qilishi mumkin.

Graf o‘zgarishini boshqarish

Dependency qo‘shilgan pull request graph diff orqali yangi edge va transitive hajmni ko‘rsatishi mumkin. Kichik import katta toolchain yoki runtime paketni olib kirsa, oddiy source diffda bu sezilmasligi mumkin. Graph budget binary size, license va build vaqtini boshqarishga yordam beradi.

Build graphning konfiguratsiyaga bog‘liq variantlari alohida tahlil qilinadi. Linuxda ko‘rinmaydigan cycle Windows targetida paydo bo‘lishi mumkin. CI supported platformalar uchun graph yaratib, missing target va visibility violationni compile boshlanishidan oldin topadi. Query natijasini cache qilish mumkin, ammo build fayli va konfiguratsiya o‘zgarsa u ham invalid qilinadi.

Bog‘liq tushunchalar

Directed acyclic graph, Build target, Dependency graph, Critical path, Incremental build, Build scheduler, Remote cache