Lego city toy on table

Paket ve Bağımlılık Yönetimi

Bir yazılımın derlenmiş ya da kaynak kodunu içeren dosyalar bütününe Paket denir. Oluşturulan bu paket kendi başına çalışan bir uygulama olabileceği gibi, projelerimizde kullanmak üzere dahil edebileceğimiz modüllerde olabilir. Bu yazıda modül olarak projemize dahil edebileceğimiz paketlere odaklanıyor ve bunların bağımlılık yönetiminden bahsediyor olacağım.

Çoğunlukla tüm yazılım altyapılarında bir paket yönetim sistemi vardır ve paket yönetim sistemleri temelde benzer işlevlere sahiptir.

Örneğin; Linux dağıtımlarında Debian için apt, Centos için yum, MacOS için HomeBrew varken aynı şekilde yazılım dilleri içinde; PHP için composer, Python için PIP, Microsoft geliştirme ortamları için NuGET, NPM için Yarn, Bower bulunmaktadır.

Paket yönetim sistemi ya da paket yöneticisi; yazılım paketlerinin ve kütüphanelerinin kurulum, güncelleme, konfigürasyon, kaldırılması işlemlerinin tutarlı ve stabil bir şekilde yürütülmesini sağlayan olan sistemlerdir. Tipik olarak paket ve kütüphanelerin hangi versiyonunun kurulduğunu ve birbirlerine olan bağımlılıklarını da hesaba katarlar. Modern paket yöneticilerinin birçoğu merkezi bir kaynaktan yazılım ve kütüphanelerin indirilip yüklenmesi işlevine sahiptirler.

tr.wikipedia.org/wiki/Paket_y%C3%B6netim_sistemi

Yukarıdaki örnekte vermiş olduğum paket yöneticileri bizim belirleyebildiğimiz ya da daha önceden belirlenmiş olan ve/veya değiştirilemeyen merkezlerden, ihtiyaçlarımız doğrultusunda paketleri ve bu sayede bağımlılıklarımızı yönetebilmemizi sağlarlar.

Paketler nedir, paket yöneticileri (paket yönetim sistemleri) nedir konusunu tamamladığımıza göre artık işin bağımlılık kısmına geçebiliriz.

Modül olarak çalışabilen, projelerimize dahil edilmek üzere hazırlanan paketleri kullanmamız halinde artık projemiz bu paketlere bağımlı hale geliyor. Paket içerisinden bir kısım kod/modül’ü kopyalayıp projemize dahil etmeyip tüm paketi dahil ettiğimizden artık uygulamamızın çalışabilmesi için bu paketlere doğrudan ihtiyacımız oluyor. İşte bu ihtiyacı bağımlılık olarak tanımlıyoruz.

Dikkat Edilmesi Gerekenler

  • Projemize dahil edeceğimiz paketlerin kod kalitesinin alternatiflerine kıyasla iyi olmasını (akabinde performansını), testlerinin olmasını ve popülerlik/kullanım istatistiklerini kesinlikle dikkate almalıyız. Dahil ettiğimiz bir paket içerisindeki güvenlik zaafiyet(ler)inin uygulamamızı doğrudan etkileyeceğini unutmayalım.
  • Paket sürümlerini net olarak belirtmeliyiz esnek olmamalı. Aksi takdirde sürümü yükseltilen bir paketten haberimiz olmaz. Bu durumun bir kaç farklı zararı olabilir. Örneğin; eğer yeni sürümde mevcut durumun çalışmasına engel bir değişiklik (breaking change) yapıldıysa birde üzerine sürekli Entegrasyon (ci <continuous integration>) kullanıyorsak (ki kullanmalıyız) uygulamamız bozulacaktır.
  • Paket sürüm değişikliklerini incelemeli, değişiklik kayıtlarına (change logs) bakmalıyız. Çıkartılan ya da eklenen bir özellik olabilir hatta bu incelemeler esnasında yeni sürümde oluşan olası bir güvenlik zaafiyetinide tespit edebiliriz. Bu doğrultuda yeniden düzenlememiz gereken (refactor) kısımlar olabilir.

Farkettiyseniz paketler ile ilgili üzerinde en fazla durduğumuz nokta güvenlik oldu. Son olarak unutmayalım ki bağımlı olduğumuz paketler uygulamamızın içerisinde olduğundan paketlere ait kodlara en az kendi yazdığımız kodlar kadar dikkat etmeliyiz.