Sparround

pub, pubspec və analyzer

pubspec.yaml paketin pasportudur — həm asılılıqları, həm də paketin özünü təsvir edir.

Əsas sahələr:

  • name — paketin adı, lower_snake_case; import 'package:<name>/...' məhz bundan yaranır.
  • version — semantik versiya (major.minor.patch); yalnız dərc olunan paketlərdə vacibdir.
  • environment: sdk:hansı Dart SDK versiyaları ilə işlədiyi. Bu, ən çox unudulan sahədir: sdk: ^3.6.0 yazmasan, records və ya pattern matching istifadə edən kodun köhnə SDK-da anlaşılmaz xəta ilə sınır.
  • dependencies — paketin işləmək üçün ehtiyac duyduğu kitabxanalar. Sənin paketini istifadə edən hər kəs bunları da yükləyir.
  • dev_dependencies — yalnız inkişaf və test üçün: test, lints, build_runner, mocktail. İstifadəçilərə ötürülmür — ona görə test paketini səhvən dependencies-ə yazmaq klassik səhvdir.
  • dependency_overrides — versiya konfliktini müvəqqəti aşmaq üçün. Uzun müddət qalırsa, bu artıq texniki borcdur; dərc olunan paketdə isə heç vaxt olmamalıdır.
yaml
name: billing_core
description: Domain logic for invoices and payments.
version: 1.4.2

environment:
  sdk: ^3.6.0        # which SDKs this package supports

dependencies:
  http: ^1.2.0       # needed at runtime by every consumer
  collection: ^1.19.0
  meta: ^1.16.0

dev_dependencies:
  test: ^1.25.0      # only for developing THIS package
  lints: ^5.0.0
  coverage: ^1.11.0

# Temporary escape hatch only - never in a published package.
# dependency_overrides:
#   http: 1.2.1

Tipik pubspec.yaml — dependencies və dev_dependencies ayrılığı

ConstraintNəyə icazə verirQeyd
`^1.4.2``>=1.4.2 <2.0.0`Default seçim: yeni funksiyalar və düzəlişlər gəlir, breaking change gəlmir
`^0.3.1``>=0.3.1 <0.4.0`1.0.0-dan əvvəl **minor** rəqəm breaking sayılır — interview-da sevilən incəlik
`>=1.2.0 <1.5.0`Əl ilə verilmiş diapazonKonkret səbəb olanda (məlum regressiya); səbəbi şərhdə yaz
`1.4.2`Yalnız həmin versiyaKitabxanada qadağan sayılır: istifadəçilərdə versiya konflikti yaradır
`any`İstənilən versiyaPraktikada təhlükəlidir — gələcək major buraxılış paketini sındıra bilər
`path: ../billing_core`Lokal qovluqdanMonorepo və lokal inkişaf üçün; dərc oluna bilməz
`git: {url: ..., ref: v1.4.2}`Repozitoriyadan, konkret ref iləDaxili paketlər üçün normaldır; `ref` mütləq tag/commit olsun, branch yox

`pubspec.lock` həll edilmiş dəqiq versiyaları saxlayır.

  • Tətbiq (app, CLI, Flutter tətbiqi) — lock faylını commit et: komanda və CI eyni versiyalarla işləsin, "mənim maşınımda işləyir" halı aradan qalxsın.
  • Kitabxana (dərc olunan paket) — commit etmə: istifadəçilər öz həllini qurur, sənin lock faylının onlara heç bir təsiri yoxdur, sadəcə səs-küy yaradır.

Gündəlik əmrlər:

  • dart pub get — lock faylına uyğun yükləyir (CI-da məhz bu işlədilir).
  • dart pub upgrade — constraint-lərin icazə verdiyi ən yeni versiyalara qalxır və lock-u yeniləyir.
  • dart pub upgrade --major-versions — constraint-lərin özünü də qaldırır (breaking ola bilər).
  • dart pub outdated — heç nəyi dəyişmədən hesabat verir: hansı paket köhnəlib, yeniləmə üçün constraint dəyişməlidirmi.
  • dart pub deps — asılılıq ağacı; konflikt araşdırarkən əvəzsizdir.

Statik analiz Dart ekosisteminin ən güclü tərəfidir:

  • dart analyze — tip xətaları + lint qaydaları; CI-da --fatal-infos ilə işlədilir ki, xəbərdarlıqlar da bloklasın.
  • dart format — mübahisəsiz vahid formatlama; CI-da dart format --output=none --set-exit-if-changed .
  • analysis_options.yamlinclude: package:lints/recommended.yaml (paketlər üçün) və ya package:flutter_lints/flutter.yaml; üstündən linter: rules: bölməsində komandanın qaydaları əlavə olunur.
  • dart fix --dry-run / dart fix --apply — lint xəbərdarlıqlarının böyük hissəsini avtomatik düzəldir; SDK yeniləyəndən sonra ilk işlədiləcək əmr məhz budur.

Interview tövsiyəsi: "Dart paketi üçün CI-da nə işlədirsən?" sualına əmrləri sıra ilə və səbəbi ilə say — bu, hazır cavab təsiri bağışlayır: dart pub getdart format --output=none --set-exit-if-changed . (formatlama müzakirəsini kod review-dan çıxarır) → dart analyze --fatal-infos (xəbərdarlıqların yığılmasının qarşısını alır) → dart test --coverage=coverage → dərc olunan paketdirsə dart pub publish --dry-rundart pub outdated. Sonda bir cümlə əlavə et: "dart fix --apply CI-da yox, lokal olaraq işlədilir — CI kodu dəyişməməlidir, sadəcə uyğunsuzluğu bildirməlidir."

📚 Mənbələr və sənədlər