Paket Yöneticisi Nedir? Neden İhtiyaç Duyulur?
Linux tabanlı işletim sistemleriyle iç içe olduğum dönemlerde sıklıkla duymaya başladığım ve o dönemden bu güne pek çok alanda kullanılmaya başlanan bir ifadeden bahsedeceğim; paket ve bu paketlerin yönetiminde kullanılan paket yöneticiler.
Paket
Paket, bir yazılımın derlenmiş hali ya da kaynak kodu olabilir. Bu nedenle modül (module) ifadesi de bu tür uygulamaları nitelendirirken kullanılabilmektedir. macOS uygulamaları, Linux işletim sisteminde kullanılan uygulamaları / yazılımları paket olarak ifade edebiliriz. Ayrıca, geliştirilen bir uygulama içerisinde yer alan birbirinden bağımsız geliştirilen ve tek başına da işleve sahip araçlar da paket olarak nitelendirilebilirler. Bir paket derlenmeden önce pek çok pakete ihtiyaç duyabilir. Bu ihtiyaç durumu bağımlılık (dependency) olarak ifade edilir. Bağımlılıklar da aynı zamanda ayrı paketlerdir. Örneğin, Brew ile Vue.js indirmesi gerçekleştirdiğinizde aslında bir Vue framework’ü edinmiş olursunuz ve Vue kendi başına bir işleve sahiptir. Vue ile uygulama geliştirirken kullandığınız harici bir paketi farklı geliştirme ortamlarında, kütüphane ve framework’lerle birlikte de kullanabilirsiniz. Ayrıca, Vue yarn ve npm dışında vue add
ile kendi kapsamında da paket yönetimi sürecini ele almaktadır. Diğer yandan, Yarn ve NPM gibi harici JavaScript paket ve bağımlılık yöneticilerini de yine süreçte kullanabilmekteyiz. macOS ve Linux tabanlı işletim sistemlerinde de yine resmi olan ya da 3. parti tarafından geliştirilen pek çok paket yöneticisi alternatif olarak sunulmakta ve kullanılabilmektedir. Paketler, geliştirilme süreçlerinde sürümler arasında farklılıklara sahip olabilmektedirler. Bu nedenle, paket ve bağımlılık yöneticileri bir paketi sürümlere göre edinebilme imkanı sunarlar.
Paket ve Bağımlılık
Paket ifadesinin açıklamasında, paketin nihai bir uygulama olabileceğinden de bahsetmiştim. Bağımlılık (dependency), bu nihai paket öncesinde, geliştirme sürecinde kullanılan paketleri nitelendirmektedir. Bir uygulamanın development ve/veya production aşamalarında çalışabilmesi için gerekli olan paketlerdir.
Paket Yönetim Sistemi
Uygulama geliştirirken ya da nihai bir uygulamayı işletim sistemimize indirirken kurulum, yapılandırma ve uygulamanın kaldırılması gibi süreçler söz konusu olabilmektedir. Diğer yandan, uygulamaların yeni sürümlerinin ve olası sürüm farklılıklarının ve güncelleme notlarının takip edilmesi de ayrı bir önem arz eder. Bu gibi süreçlerde kararlı bir şekilde çalışan araçlara ihtiyaç duyulmaktadır. Paket (package) ve bağımlılık (dependency) yöneticiler (package manager ya da package-management system) tam olarak bu süreci üstlenirler. Ortaya çıkan gereksinimlere göre yöneticiler farklı ele alış biçimlerine sahip olabilirler.
Öne Çıkan Paket Yöneticiler
Linux işletim sistemine aşinalığınız varsa ihtiyaç duyduğunuz bir uygulama için, en azından birkaç defa APT (Advanced Package Tool) kullanmışsınızdır. APT, Debian tabanlı Linux dağıtımlarında kullanılan bir paket yönetim sistemidir. Benzer şekilde macOS için de MacPorts, Homebrew bilinen paket yöneticilerdir. JavaScript paketleri için npm, yarn, bower bilinen paketlerden birkaçıdır. Bower artık kullanılmazken1 yeni paket yöneticiler sahneye çıkmaktadır.
Paket Yöneticilerin Temel Özellikleri
Bir paket yöneticisi öncelikle paket edinme sürecinde paketin doğruluğunu ve bütünlüğünü kontrol etmelidir. Bu süreç checksum kontrolü olarak ifade edilir. Sonrasında, paketin kaynağının kimlik doğrulamasını yapabilmelidir. Bu tür doğrulama süreçlerinde sayısal imzalar kullanılmaktadır. Yarn ile ilgili yazıda yer alan listede Yarn’ın odaklandığı çözümler ve sunduğu özellikler görülebilmektedir. Gerekli olabilecek diğer özellikleri ise şu şekilde sıralayabiliriz:
- Güncelleme, güncelleme takibi ve güncellemelerin depo üzerinden gerçekleştirilmesi (yine kaynak doğrulama ve paket kontrolü ile birlikte)
- Paketin ihtiyacı olan uygulamalar ve/veya diğer paketler ile birlikte kurulduğundan emin olmak için bağımlılık yönetimi yapmak.
- Paketlerin hataya sebebiyet vermeyecek şekilde yapılandırılması / kaldırılması.
Tüm anlatımları derleyip bir durum senaryosu üzerinden ifade edelim. Bir projeye başladığınızda bazı işlemleri karşılayan ek kütüphaneler, framework’ler veya kod parçacıklarına ihtiyaç duyabilirsiniz. İlgili kaynaklar önceliklerine göre belirlenir ve sırayla indirilerek proje alanında konumlandırılır. Aradan geçen zaman içerisinde olası güncellemeler kontrol edilir, varsa değişiklikler uygulanır, desteklenmeyenler projeden kaldırılır (çoğu zaman) ve uygulama yeniden ayağa kaldırılır. Takibi ve yönetimi oldukça uğraştırıcı, değil mi? Diğer yandan, bir diğer senaryoda uygulamanın yedeğini almak ya da farklı bir alana taşımak isteyelim. Bu durumda yukarıdaki işlemi yinelememiz ve yeniden yapılandırmamız gerekecektir. İşte paket yöneticiler bu süreci ele alırlar. Kullanılan tüm bağımlılıkları / paketleri çeşitli bilgilerle (metadata) birlikte (name, description, version number, vendor, checksum, dependencies…) kayıt altında tutarlar (örneğin package.json bir local package database’dir) ve yeri geldiğinde indirme-güncelleme-kaldırma işlemlerini tek bir komutla uygularlar. Bir başka alanda tüm bağımlılıklar yerine bu dosyaların kullanılması yeterli olacaktır. Gerisini paket yöneticisi kendisi halletmektedir. Örneğin, Homebrew yedekleme ve yapılandırma işlemleri başlıklı yazıda macOS işletim sistemindeki uygulamalar için benzer bir listenin nasıl oluşturulabileceğinden bahsetmiştik. Web projelerinde de durum aynı bu şekilde yürütülmekte ve paketler ihtiyaçlar doğrultusunda kolaylıkla yapılandırılabilmekte.