Dependency Hell'den Çıkmak: pub.lock vs package-lock.json

Bir proje altı ay sonra açıldığında birdenbire çöküyor. Geliştirici 'ama ben hiçbir şey değiştirmedim' diye haykırıyor. Sebep: paket bağımlılıkları. Dart'ın pub.lock ile Node.js'in package-lock.json aynı sorunu çözmek için farklı yollara gidiyor. İkisi de lock dosyası tutuyor ama davranışları ve güvenilirliği çok farklı.

Node.js tarafında package-lock.json bir rehber gibi çalışıyor. Yazılı olan versiyonları takip eder, ama npm yine de npm registry'ye bakar ve güncellenmiş bir paket bulursa onu indirebilir. Sürüm aralığı (^1.2.3 gibi) tanımlandıysa, lock dosyası o aralık içindeki en son versiyonu seçer. Sonuç: iki farklı makinede aynı lock dosyası olmasına rağmen bazen farklı paketler kurulabiliyor. Özellikle pre-release veya yanında başka bağımlılıkları olan paketlerde bu durum ortaya çıkıyor.

Dart'ın pub.lock ise katiyen bir anlaşma belgesi gibi davranıyor. Yazılı olan tam sürümler kullanılır, başka seçenek yok. Sürüm aralığı pubspec.yaml'da tanımlanabilir ama bir kez pub get çalıştırıldıktan sonra pub.lock'ta sabit kalır. Bunu değiştirmek için pub upgrade komutunu açıkça çalıştırman gerekir. Bu, üretim ortamında öngörülebilirlik sağlıyor ama aynı zamanda güvenlik yamalarını almak için daha bilinçli adım atmak gerektiğini anlamına geliyor.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Deneyde görülen fark şu: Node.js'te npm ci (clean install) kullansan bile, package-lock.json'daki aralıklar gözardı edilmez. Dart'ta pub get tamamen deterministik, aynı lock dosyasıyla aynı paketler gelir, hiç şüphe yok.

Praktik olarak, Dart geliştirirken pub.lock'u version control'e koymak ve pub upgrade'i bilerek yapmak daha güvenli. Node.js'te ise package-lock.json'u tutsan bile, npm audit fix gibi komutlar ya da yarn berry gibi alternatif yöneticilere geçmek daha stabil sonuç verebiliyor. Eğer tam determinizm istiyorsan Node.js'te Yarn v3+ veya pnpm gibi alternatifler daha iyi iş çıkarıyor.

Hangi strateji seçilirse seçilsin, lock dosyasını tutmak ve bunu version control'e koymak zorunlu. Ama Dart'ın yaklaşımı (katı sürüm kilidi) üretim ortamında daha az sürpriz yaşatıyor. Node.js ekosistemi esneklik sunuyor ama o esneklik yönetilmezse dependency hell'e çabucak düşülebiliyor.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz