NPM (Node Package Manager) Nedir?
Paket ve paket yöneticiler ile başlayan yazı dizisinde, süreci biraz tersten ele alıp öncelikle Web geliştirme süreçlerinde kullanılan Yarn‘a değinmiştim.
Ardından, Node.js ile NPM’in de başlangıcını yapmaya çalıştım. Bu yazıda, Yarn’ın da temel olarak ele aldığı JavaScript paket yöneticisi olan NPM (Node Package Manager)’in ne olduğu ve ne tür özellikler barındırdığını özetlemeye çalışacağım.
NPM (Node Package Manager)
NPM (Node Package Manager / Node Packaged Modules), Isaac Z. Schlueter1 tarafından, tamamen JavaScript dili kullanılarak geliştirilen, temel olarak bir harici olarak sunulan yazılımların / paketlerin / modüllerin yönetimini sağlayan bir paket yöneticisi2.
NPM makes it easy for JavaScript developers to share and reuse code, and it makes it easy to update the code that you’re sharing
Paket ve bağımlılık yöneticiler çerçevesinde aslında temel özelliklere geniş bir bağlamda değinmiştim. Tekrar hatırlamak gerekirse;
- Otomatik ya da el yordamı ile projelere paketleri dahil etme / yükleme
- Edinilmiş paketleri silme
- Kullanılan paketleri kayıt altında tutma (package.json vb.) ve listeleme
- Kullanılan paketleri güncelleme
Unutmadan, genelde paket yöneticiler (elbette NPM de buna dahil) komut satırı aracılığıyla yönetilirler.
NPM Kurulumu
NPM kullanımı için öncelikle Node.js’in sistemde kurulu olması gerekmekte. Node.js başlıklı yazıda indirme bağlantısı ve ilgili temel bazı bilgileri paylaşmıştım. Node.js kurulumu ile birlikte kararlı NPM paketi de sistemde yer alacaktır. Bu kurulum (Node.js ve NPM’in birlikte edinilmesi) tavsiye edilen indirme biçimidir.
Kurulumları test etmek için şu komutlar aracılığıyla versiyon kontrolleri yapabilirsiniz:
node -v
npm -v
Package.json
Package.json yer aldığı projede kullanılan paketler / modüller ve bağımlılıklar (dependencies) hakkında bilgiler içeren bir yerel paket veritabanı (local package database)'dır. Bir projeye başlandığında el yordamı ile oluşturulabileceği gibi (uyulması gereken bir syntax vardır) NPM aracılığıyla init
komutu kullanılarak da oluşturulabilir. Örnek olarak NPM ile oluşturma işlemini ele alalım.
npm init
Komut uygulanır uygulanmaz prompt aracılığıyla şu dönüş sağlanır:
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See `npm help json` for definitive documentation on these fields
and exactly what they do.
Use `npm install ` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
package name: (example)
Gerekli bilgilerin doldurulmasının ardından, package.json
dosyası içerisinde şu örnek içeriğe benzer şekilde yer bulur:
{
"name": "example", // proje adı
"version": "1.0.0", // proje versiyonu
"description": "", // proje açıklaması
"main": "index.js", // entry point yani ilk talimatların ve argümanların bulunduğu yer
"scripts": { // paket ile ilişkili komut dosyası komutlarının yer aldığı yer
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "", // projenin yazarı
"keyword": "", // projeyi tanımlayan anahtar kelimeler
"license": "ISC" // projenin lisansı
}
Bu bilgiler bir metin editörü aracılığıyla istenilen zamanda düzenlenebilir. Ayrıca, bu tanımlarla uğraşmamak için -y
flag ile komutu uygulayabilirsiniz.
npm init -y
NPM Paket Kurulumu
Node Package Manager (NPM) ile iki şekilde paketleri kurabiliriz; local ve global. Candidate mode olarak ifade edilebilecek kurulum yapısında;
- Global, modülleri
{prefix}/lib/node_modules
, yürütme dosyalarını (executable files){prefix}/bin
, man dosyalarını{prefix}/share/man
içerisine aktarır.{prefix}
genellikle/usr/local
dizinine karşılık gelir. - Lokal, modülleri çalışılan dizine (proje dizinine) kurar. Genellikle kurulum
./node_modules
klasörü oluşturularak gerçekleştirilir. Yürütme dosyaları da yine bu klasör içerisinde./node_modules/.bin/
içeriğinde tutulur. man dosyaları lokal kurulumda işleme alınmaz.
Kurulum Tercihi
- Sadece proje bağlamında kullanılacak bir paketten söz ediyor ve
require('...')
şeklinde çağırıyorsak ilgili paket / modül kurulumunu lokal olarak gerçekleştirebiliriz. - Kurulum yapılacak paket / modül genel bir ihtiyacı karşılıyorsa ve sıklıkla kullanılacaksa kurulum global olarak gerekleştirilebilir.
Genellikle her iki şekilde de kurulum yapılması önerilir ya da global kurulum yapılıp sembolik (symbolic) link ile ilişkilendirme sağlanabilir. Örneğin, npm link coffee-script
gibi. Daha detaylı bilgi için npm 1.0: Global vs Local installation3 sayfasına göz atabilirsiniz.
Öncelikle, ön tanımlı olarak kurulumun lokal olarak gerçekleştirileceğini belirtmeliyim. Şimdi örnek bir paket kurulumu gerçekleştirelim. Öncelikle newproject
adında bir klasör oluşturalım ve package.json
dosyamızı oluşturalım.
mkdir newproject
cd newproject
npm init -y
İndirme işlemini express.js için gerçekleştirelim.
npm install express
Komutun uygulanmasının ardından newproject
dizininde node_modules
klasörü oluşturulacak ve express
paketi bu klasör içerisine yüklenecektir. Bu kurulumun ardından uygulamamız içerisinden pakete ../node_modules/express
ile erişebiliriz. Şimdi, bu kurulum işlemini bir de global olarak yeniden ele alalım.
npm install express -g --save-dev
Bu kurulumun ardından newproject
klasöründe node_modules
alt klasörü oluşturulmayacaktır. Kurulum /usr/local/lib/node_modules/express
yoluna sahiptir. Global kurulumu --save-dev
ile ele aldığımızda ilgili tanımlama da dependencies
olarak package.json
dosyasına eklenecektir.
"dependencies": {
"express": "^4.17.1"
}
dependencies, --save
flag tanımlandığında paket bilgilerinin ekleneceği alandır. Bu paketler production için gereklidir. devDependencies ise --save-dev
ile paketlerin detaylarının ekleneceği yerdir. Burada tutulan paketler geliştirme ve test için gereklidir. Dolayısıyla yukarıdaki install işlemini4 duruma göre tanımlayabilirsiniz. Projemize ilgili modülü / paketi şimdi de sembolik bağlantı ile entegre edelim.
npm link express
Bu durumda node_modules
klasörü ve içeriğinde express
sembolik bağlantısı oluşturulur.
/Users/user/Desktop/newproject/node_modules/express -> /usr/local/lib/node_modules/express
package.json
dosyasına baktığınızda dependencies
olarak express
tanımının yapılmamış olduğunu görebilirsiniz. Bunun nedeni global yükleme işleminin haricen gerçekleştirilmesidir. El yordamı ile ilgili paket package.json
dosyasına dahil edilebilir. Ya da sembolik bağlantının takip edilip otomatik bir şekilde eklenmesi için npm init -y
komutunu yineleyebilirsiniz.
Diğer Paket İşlemleri
Install
dışında kurulu paketleri nasıl listeleyebileceğimize, güncelleyebileceğimize ve proje dizininden kaldırabileceğimize bir bakalım.
npm list
Global modül kurulumlarında listelemede ilgili paketler UNMET DEPENDENCY uyarısıyla birlikte listelenirler. npm uninstall [paket-adi]
ile bir paketi silebilir, npm update [paket-adi]
ile belirtilen paketin güncellenmesini sağlayabiliriz. npm outdated
ise package.json
içeriğindeki paketlerin durumlarını listeler.
Package Current Wanted Latest Location
express linked 4.17.1 4.17.1 newproject
Yukarıdaki komutları yine global olarak ele almak mümkün. Bu durumda, ilgili koda sadece -g
eklemeniz yeterli olacaktır. Geliştirme ve/veya production aşamasında tanımlı paketleri yukarıdaki komutları uygularken --save
ve --save-dev
ile ayrı ayrı işleme alabiliriz.
Son Olarak
NPM, Node.JS için varsayılan paket yöneticisidir. Ancak, geliştiricilerin yaşadıkları sorunlar ve ihtiyaç duyulan ek özellikler sebebiyle süreç içerisinde farklı alternatifler de geliştirilmiştir. Örneğin yarn ve bower alternatif JavaScript paket yöneticileri olarak ifade edilebilirler. Fakat, [bowe projesi rafa kaldırılmış5, Yarn öne çıkan bir alternatif haline gelmiştir.
Aşağıda, ayrıca farklı kaynaklarca yayınlanmış NPM yazılarının bir listesini iletiyorum.