NodeJS Adım 6 — Npm paket yöneticisi

Adım Adım Nodejs yazı dizimizin bir önceki bölümünde modül oluşturmayı ve bunları kullanmayı öğrendik.

Amacımız sürekli aynı kodları yazmamak ve tekrar kullanılabilir program parçaları üretmekti. Peki yazdığımız bu modülleri başkalarının kullanmasını sağlayabilir miyiz? Yada başkalarının yazdığı modülleri biz kullanabilir miyiz? Yada kullandık diyelim. Daha sonra bu modülün sahibi paketi güncellediğinde kolayca güncelleyebilir miyiz? (Bu arada paketi modülün paketlenmiş kullanıma hazır hali gibi düşünebilirsiniz. Aslında aynı şeyler.)

Tabiki. Bunu npm yani node package manager ile çok kolay bir şekilde yapabiliriz. npm nodejs’i yüklediğimizde yüklenen bir araç. npm ile oluşturmuş olduğumuz modülleri başkalarının kullanması için yayınlayabiliriz. npm resmi olarak https://www.npmjs.com adresini kullanır. Yayınlamış olduğumuz paketlere herkes bu adresten erişebilir. Yine npm ile herkesin açık olarak yayınladığı paketlere bizde buradan ulaşabiliriz. Ben bu yazıyı yazarken toplam paket sayısı 330338 adet idi. Paket yayınlamaya çok girmeyeceğim. Gerekli dokümantasyona buradan ulaşabilirsiniz.

npm ile Paket Yükleme

npm tamamen konsol üzerinden kullanılan bir araç. npm ile tüm işlerimizi konsol komutları ile yapacağız. Paket yüklemek için kullanacağımız komut ise şu şekilde: npm install paketadi . Bu komut ile npm üzerindeki bütün paketlere ulaşabiliriz. Tabi bu paketlerin ne işe yaradıkları ve nasıl kullanıldıklarını paketlerin dökümantasyonundan öğreneceğiz. Örnek olarak lodash paketini yükleyelim. Bunun için konsol ekranına npm install lodash yazmamız yeterli. Bu komut npm’nin deposundan lodash paketini bizim için indirecektir. Peki ama nereye yükleyecek? npm ile yüklediğimiz paketler bulunduğumuz klasör içerisindeki node_modules adındaki bir klasöre yüklenir.(Klasör yoksa oluşturulur.) Bu paketleri kod içerisinde nodejs’in var olan paketleri gibi kullanabiliriz. Örneğin lodash paketini kullanmak için var ldsh=require(“lodash”); yazmamız yeterli. Nodejs bu paketi node_modules klasörü içerinde bulup ldsh değişkenine atacaktır. Lodash içerisinde bütün nesne ve fonksiyonlarıda ldsh değişkeni ile erişebilir.

6-1-node-npm

İlk paketimizi yüklemiş olduk. Aslında npm ile sadece nodejs paketleri yüklemiyoruz.Nodejs paketleri dışında css paketleri, javascript paketleri(ön yüz geliştirme için) … gibi paketlerde yükleyebiliriz. Mesela bootstrap css frameworkünü npm ile yükleyebiliriz. Bunun için şu komutu vermemiz yeterli npm install bootstrap . Aynı şekilde jquery javascript kütüphanesini yüklemek istiyorsak şu komutu vermemiz yeterlidir: npm install jquery . npm’nin bir diğer yeteneği de yüklemek istediğimiz paketlerin istediğimiz versiyonunu yükleyebiliyor olmamız. Mesela jquery’nin 1.11.2 versiyonunu yüklemek istiyorsak şu komut bizim için yeterli olacaktır: npm install jquery@1.11.2 .Geçmiş versiyonlar gibi alfa veya beta versiyonlar içinde yükleme yapabiliriz. Bütün bu versiyonlar tabiki paket sahibi tarafından belirleniyor. Yükleyeceğimiz paketin çalışması için başka bir paket yüklenmesi gerekiyorsa npm bizim için onları da yüklüyor. Mesela jquery validation paketinin çalışması için jquery paketininde yüklenmesi gerekiyor. Siz npm install jquery-validation komutunu çalıştırdığınızda npm jquery validation paketiyle beraber jquery paketini zaten yüklemiş oluyor.

package.json Dosyası ve Maharetleri

Peki bizim projemiz için toplam paket sayısı 50yi geçti diyelim. O zaman bizim projemizin boyutu çok yükseleceği için taşınabilirliği düşecektir. Projeyi iş arkadaşımıza vereceğiz diyelim. 50 paketin hepsiyle beraber kopyalayıp vereceğiz. Yada diyelimki kodlarımızı versiyon kontrol sistemine yüklüyoruz. Ve sürekli versiyonlama yapıyoruz. Yükleme ve versiyonlamanın tamamı 50 paket ile birlikte olacak. Buda çok zaman alacaktır. Bu işin kolay bir yolu yok mu? Tabiki var. package.json dosyası.

package.json dosyası projemizin ana dizininde bulunan ve projemiz hakkında bilgiler içeren, projemiz içerisinde kullanılan paketlerin listesini tutan, projemiz için konsolda kullanılabilecek komutlar için kısa yollar eklenebilen ve daha fazlasını içeren özel bir json dosyasıdır. Örnek bir package.json dosyası şu şekildedir:

{
"name": "proje_adi",
"version": "1.0.0",
"keywords": [
"nodejs",
"npm",
"ders",
"ornek"
],
"description": "proje açıklaması",
"main": "program.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Emre KAÇAN",
"license": "MIT",
"dependencies": {
"bootstrap": "^3.3.7",
"jquery-ui": "^1.12.0",
"lodash": "^4.15.0"
}
}

Dosyamızın içeriğine bakacak olursak name alanı projemizin adı, version alanı projemizin şuan hangi versiyonda olduğu, keywords alanı projemiz hakkındaki anahtar kelimeleri, description alanı projemiz hakkında açıklama, main alanı projemizi çalıştırmaya hangi dosyadan başlanacağını, scripts projemiz için konsolda çalıştırabileceğimiz komutların kısaltmaları, author alanı proje yazarı/sahibi, license proje lisansı ve son olarak da dependencies projemizin bağımlılıkları yani projemizde kullandığımız paketlerin listesi hakkında bilgi verir.

Projemizin ana dizinine bir dosya oluşturup adına package uzantısına da .json vererek bu dosyayı oluşturabiliriz. İçeriğini yukardaki gibi kendimiz yazabiliriz. Ama bunun daha kolay bir yolu var. konsoldan şu komutu vermemiz yeterli npm init . Bu komutu verdiğimizde bize birkaç soru sorulacak ve sorular bittiğinde dosya kendisi oluşacak. Daha önceden yüklemiş olduğunuz paketler varsa onlarıda dependecies yani bağımlılıklar yani paket listesine ekleyecektir. Soru soruların hepsine cevap vermek zorunda değilsiniz. Hiçbirine cevap vermeyip sadece paketleri algılamasını sağlayabilirisiniz.

6-2-node-npm

Dosyamızı oluşturuk. Bu dosya projemiz hakkında bir çok bilgi barındırıyor. En önemliside paket listesi. Artık projemizi taşırken node_modules klasörünü silebiliriz. Yada projemizi versiyon kontrol sistemlerine atarken node_modules klasörünü hariç tutabiliriz(exclude). Peki ama projeyi alan başka bir kişi paketleri tekrar nasıl yükleyecek? Çok basit şu komutla: npm install . Biz bu komutu konsola yazdığımızda npm package.json dosyasına bakacak ve içerisindeki paketleri yükleyecek. Özellikle github üzerinden indirdiğiniz veya checkout yaptığınız projelerin çoğunda projeyi çalıştırmadan önce bu komutu vermeniz gerekir.

package.json içerisindeki scripts kısmı için projemiz için konsolda kullanacağımız komutların listesini tutabiliriz demiştik. Mesela programımızı konsolda çalıştırmak için node program.js komutunu veriyorduk. Bunu package.json içerindeki script kısmına ekleyelim.

{
...
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
“start”: ”node program.js”
},
...
}

Artık projemizi npm ile başlatabiliriz. Konsola şu komutu vermemiz yeterli : npm start

Bir scripte birden fazla komutta yazabiliriz. package.json dosyamızı şu şekilde değiştirelim:

{
...
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
“start”: ”npm install && node program.js”
},
...
}

Konsola tekrar npm start yazdığımızda npm önce npm install komutunu çalıştırıp paketleri yükleyecek, daha sonra node program.js komutunu çalıştırıp programı çalıştıracak.

npm ile ilgili söyleyeceklerimiz bu kadar değil ama ilk aşama için bu kadar yeterli sanırım. Gerisini keşfetmek size kalmış.

npm ile Global Paketler ve Küçük Araçlar

npm ile paket yüklemek bu kadar kolayken bu kolaylığı başka yerlerde kullanmamak olmazdı. npm ile konsolda kullanabileceğimiz küçük araçlarda yükleyebiliriz. Mesela resimlerinizi yeniden boyutlandıran bir konsol aracı düşünün. Siz aracın adını yazıyorsunuz, resmin adını yazıyorsunuz, boyutu yazıyorsunuz ve o araç sizin için o resmin boyutunu büyütüyor veya küçültüyor. Büyük kolaylık. Tek satır komut ile işimizi halletmiş oluyoruz. Bunun için npm bize yeter. Ama npm yüklediği paketleri node_modules klasörüne atıyordu. Oradaki bir araç nasıl olacakta konsolda çalışır hale gelecek? Tabiki oraya yüklemeyerek. npm ile istediğimiz paketleri global olarak yükleyebilir. Mesela yukarıda bahsettiğim örnek için paketimizin adı resize-img-cli. resize-img-cli paketini global olarak yüklemek için konsola şu komutu vermemiz yeterli: npm install — global resize-img-cli . Yada npm install -g resize-img-cli . İki komutta aynı. Bu komut ile resize-img-cli paketini bilgisayarımızda bulunan global npm deposuna yüklüyor. Ve biz resize-img-cli paketini konsol üzerinden istediğimiz gibi kullanabiliyoruz. Mesela resize-img-cli ile bir resmin boyutunu değiştirmek için resize-img-cli resim1.jpg — width 200 > resim2.jpg komutunu çalıştırmamız yeterlidir. Bu komut npm’nin global deposundaki resize-img-cli aracını çalıştıracak ve parametre olarak verdiğimiz resim1.jpg dosyasını alacak ve boyutunu değiştirip resim2.jpg adında yeniden kaydedecek. (Bu aracı kullanmayı tabiki dokümantasyonundan öğreniyoruz.) Bu kadar.

6-3-npm

Paket yüklemeyi ve global paketlerle küçük araçlar kullanmayı bu kadar kolaylaştırdığı için npm’nin şuan yüzbinlerce paketi var. Ve çok popüler olarak kullanılmakta. İnsanlar nodejs kullanmasa bile npmyi bir şekilde kullanıyorlar. Çünkü npm araçları sadece nodejs değil nodejs dışında birçok işe yarıyor. Birkaç örnek vermek gerekirse yeoman paketi ile proje taslakları oluşturabilirsiniz, gulp paketi ile projenizde yaptığınız sürekli görevleri otomatize edebilir, less paketi ile .less dosyalarınızı derleyebilirsiniz… gibi daha birçok küçük araçlar işleriniz kolayca halledebilirsiniz.

npm ile anlatılabilecekler tabiki bu kadar değil. Ama bunlar sanırım yeterli olacaktır. Daha fazla bilgi ve paket için npmjs.com adresine bakabilirsiniz.

Diğer bölümde nodejs’e geri dönüp httpClient ile web sitelerine ve servislerine bağlanmayı ve olayları anlatacağım.