JavaScript

NPM (Node Package Manager) Nedir?

Yayın:
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 ...
GÖRSEL
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. Schlueter 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öneticisi.
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 Nedir? 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</p>
 
<h3 class="ui header">Package.json</h3>
<strong>Package.json</strong> 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 <code>init</code> komutu kullanılarak da oluşturulabilir. Örnek olarak NPM ile oluşturma işlemini ele alalım.
 
<pre lang="bash">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 <pkg>` 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.

Hangi Kurulum Tercih Edilmeli?

  • 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 installation 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şlemini 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/ya 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, bower projesi rafa kaldırılmış, 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.

HABERDAR OL

Yeni eklenen projeler, eğitimler, içerikler ve yayınlanan videolar e-posta adresine gelsin.