Cheat Sheet: npm ve Yarn Komutları Karşılaştırmalı Kılavuzu
Modern JavaScript geliştirme dünyası, sürekli değişen araçlar ve teknolojilerle doludur. Bu dinamik ortamda, projelerin bağımlılıklarını yönetmek, paketleri kurmak, güncellemek ve kaldırmak gibi temel görevler için güvenilir bir paket yöneticisine sahip olmak hayati öneme sahiptir. Node.js ekosisteminin başlangıcından bu yana, npm (Node Package Manager) bu alandaki de facto standart olmuştur. Ancak zamanla, özellikle performans ve determinizm konularındaki bazı eksikliklerini gidermek amacıyla Yarn ortaya çıkmıştır. Her iki araç da benzer işlevleri yerine getirse de, komut yapıları, felsefeleri ve performansları açısından farklılıklar gösterirler. Bu makale, npm ve Yarn’ın temel komutlarını karşılaştırmalı bir “cheat sheet” formatında sunarak, geliştiricilerin hangi aracı ne zaman kullanacaklarına dair bilinçli kararlar vermelerine yardımcı olmayı amaçlamaktadır. Her iki paket yöneticisinin tarihçesine, temel özelliklerine, avantajlarına ve dezavantajlarına derinlemesine bir bakış atarken, yaygın kullanılan komutları yan yana inceleyeceğiz.
npm’e Derin Bir Bakış
Tarihçe ve Kökenler
npm, 2010 yılında Isaac Schlueter tarafından Node.js için resmi paket yöneticisi olarak piyasaya sürüldü. Node.js’in popülaritesinin artmasıyla birlikte, npm de kısa sürede JavaScript ekosisteminin temel taşlarından biri haline geldi. Başlangıçta, Node.js modüllerini kolayca paylaşmak ve kullanmak amacıyla tasarlanmıştı. Merkezi bir kayıt defteri (registry) aracılığıyla binlerce paketin erişilebilir olmasını sağlayarak geliştiricilerin projelerinde yeniden kullanılabilir kodları entegre etmesini kolaylaştırdı. npm’in ilk versiyonları bazı performans ve determinizm sorunlarıyla eleştirilse de, zaman içinde yapılan güncellemelerle bu eksikliklerin çoğu giderildi. Özellikle package-lock.json dosyasının tanıtılması, kurulumların daha deterministik hale gelmesine büyük katkı sağladı.
Temel Özellikleri
- Merkezi Kayıt Defteri: npm, milyonlarca açık kaynak paketi barındıran geniş bir merkezi kayıt defterine sahiptir. Bu, geliştiricilerin ihtiyaç duydukları hemen hemen her şeyi bulabileceği anlamına gelir.
- package.json: Projenin meta verilerini (adı, sürümü, açıklaması) ve bağımlılıklarını (dependencies, devDependencies) tanımlayan ana yapılandırma dosyasıdır.
- node_modules Dizini: Kurulan tüm paketler ve onların bağımlılıkları, projenin kök dizininde bulunan
node_modulesadlı özel bir klasörde depolanır. - package-lock.json: npm 5 ve sonraki sürümlerinde tanıtılan bu dosya, bir paketin her bağımlılığının tam sürümünü ve bunların bağımlılık ağacını kaydeder. Bu, farklı ortamlarda yapılan kurulumların tamamen aynı olmasını (deterministik) sağlar.
- Script Çalıştırma:
package.jsondosyasında tanımlanan özel scriptleri çalıştırma yeteneği sunar, bu da otomasyon ve geliştirme iş akışlarını kolaylaştırır.
Avantajları
- Geniş Topluluk ve Ekosistem: Node.js ile birlikte doğduğu için, npm en büyük paket ekosistemine ve en geniş topluluk desteğine sahiptir. Bu, sorun giderme ve kaynak bulma açısından büyük bir avantajdır.
- Node.js ile Entegrasyon: Node.js’in varsayılan paket yöneticisi olması, çoğu Node.js projesinin doğal olarak npm’i kullanması anlamına gelir.
- Uzun Süreli Varlık: Uzun süredir var olması, birçok eski projenin npm ile kurulmuş ve bakımı yapılmış olduğu anlamına gelir.
- npm audit: Güvenlik açıklarını tarayan ve raporlayan yerleşik bir denetim aracı sunar.
Dezavantajları
- Geçmişteki Performans Sorunları: İlk versiyonlarında, büyük projelerde bağımlılıkların kurulumu yavaş olabiliyordu. Yeni versiyonlar bu konuda önemli iyileştirmeler yapsa da, bu algı bir süre devam etti.
- Determinism Eksikliği (package-lock.json öncesi):
package-lock.jsonöncesinde, aynıpackage.jsondosyasına sahip iki farklı ortamda yapılan kurulumlar, bağımlılıkların farklı alt sürümleri nedeniyle farklı sonuçlar verebiliyordu. - Güvenlik Endişeleri (geçmişte): npm kayıt defterindeki bazı kötü niyetli paketler veya güvenlik açıkları zaman zaman endişelere yol açmıştır. Ancak
npm auditgibi araçlarla bu durum iyileştirilmiştir.
Yarn’a Derin Bir Bakış
Tarihçe ve Kökenler
Yarn, 2016 yılında Facebook (şimdiki Meta) tarafından, Google, Exponent ve Tilde’nin iş birliğiyle geliştirildi. Facebook’un dahili projelerinde npm ile yaşadığı performans, güvenlik ve determinizm sorunlarına bir çözüm olarak ortaya çıktı. Özellikle büyük monorepo projelerinde binlerce bağımlılığın yönetimi ve hızlı, güvenilir kurulumlar ihtiyacı Yarn’ın doğuşuna zemin hazırladı. Yarn, npm’in kayıt defterini kullanmaya devam ederken, kurulum sürecini tamamen yeniden yazarak önemli iyileştirmeler getirdi.
Temel Özellikleri
- Hız: Yarn, paketleri paralel olarak indirerek ve önbelleğe alarak kurulum sürelerini önemli ölçüde kısaltır.
- Determinizm:
yarn.lockdosyası sayesinde, her kurulumun aynı bağımlılık ağacını ve sürümlerini kullanmasını garanti eder. Bu, farklı geliştirme ortamları veya CI/CD süreçleri arasında tutarlılık sağlar. - Güvenlik: Yüklenen paketlerin bütünlüğünü sağlamak için kontrol toplamları (checksums) kullanır. Ayrıca, kötü niyetli kod çalıştırmayı önlemek için kurulum sırasında keyfi kod yürütülmesini kısıtlar.
- Çevrimdışı Mod: Daha önce kurulmuş paketleri önbellekten yükleyerek, internet bağlantısı olmadan bile kurulum yapılmasına olanak tanır.
- Workspaces: Tek bir depoda birden fazla paketin yönetilmesine izin veren bir özelliktir. Bu, monorepo mimarileri için idealdir.
- Plug’n’Play (Yarn Berry): Yarn 2 (veya Yarn Berry) ile tanıtılan bu özellik,
node_modulesdizinini ortadan kaldırarak performansı artırır ve bağımlılıkların daha verimli yönetilmesini sağlar. (Opsiyonel bir özelliktir ve genellikle manuel olarak etkinleştirilir.)
Avantajları
- Üstün Performans: Paralel indirme ve akıllı önbelleğe alma stratejileri sayesinde genellikle npm’den daha hızlıdır.
- Güvenilirlik ve Determinizm:
yarn.lockdosyası, tüm kurulumların aynı sonucu vermesini garanti eder, bu da “benim makinemde çalışıyor” sorunlarını azaltır. - Gelişmiş Güvenlik: Kontrol toplamları ve kısıtlı kod yürütme ile daha güvenli bir kurulum süreci sunar.
- Workspaces Desteği: Monorepo projelerinde bağımlılık yönetimini basitleştirir.
- Çevrimdışı Kurulum Yeteneği: Daha önce indirilen paketleri önbellekten yükleyerek internet bağlantısı olmadan da çalışabilir.
Dezavantajları
- Daha Yeni Olması: npm kadar uzun bir geçmişe sahip değildir, bu nedenle bazı çok eski projelerde veya araçlarda uyumluluk sorunları nadiren görülebilir.
- Öğrenme Eğrisi (Yarn Berry için): Yarn 2+’nın Plug’n’Play özelliği, geleneksel
node_modulesyapısından farklı olduğu için başlangıçta bir öğrenme eğrisi gerektirebilir. - npm Kayıt Defterine Bağımlılık: Kendi kayıt defteri olmamasına rağmen npm kayıt defterini kullanır, bu da bazı durumlarda npm’in performans iyileştirmelerini yakalamasını zorlaştırabilir.
Komutların Karşılaştırmalı Kılavuzu
Bu bölüm, npm ve Yarn’ın en sık kullanılan komutlarını yan yana karşılaştırarak, her iki araç arasındaki komut farklılıklarını net bir şekilde ortaya koymaktadır.
Proje Başlatma
Yeni bir Node.js projesi başlatmak ve package.json dosyasını oluşturmak için kullanılır.
# npm
npm init
veya interaktif olmayan modda
npm init -y
# Yarn
yarn init
veya interaktif olmayan modda
yarn init -y
Bağımlılık Yükleme
Bir projenin package.json dosyasında belirtilen tüm bağımlılıkları yüklemek için kullanılır.
# npm
npm install
veya kısaca
npm i
# Yarn
yarn install
veya kısaca
yarn
Paket Ekleme
Projeye yeni bir paket eklemek için kullanılır. Farklı bağımlılık türleri için farklı argümanlar kullanılır.
Normal Bağımlılık (dependencies)
# npm
npm install
npm i
# Yarn
yarn add
Geliştirme Bağımlılığı (devDependencies)
Sadece geliştirme sırasında ihtiyaç duyulan paketler için (örneğin test kütüphaneleri, build araçları).
# npm
npm install --save-dev
npm i -D
# Yarn
yarn add --dev
yarn add -D
Opsiyonel Bağımlılık (optionalDependencies)
Kurulumu başarısız olsa bile uygulamanın çalışmaya devam etmesi gereken paketler için.
# npm
npm install --save-optional
npm i -O
# Yarn
yarn add --optional
Global Bağımlılık
Sistemin genelinde erişilebilir olması gereken CLI araçları gibi paketler için.
# npm
npm install -g
# Yarn
yarn global add
Paket Kaldırma
Bir paketi projeden kaldırmak ve package.json dosyasından bağımlılığını silmek için kullanılır.
# npm
npm uninstall
npm un
# Yarn
yarn remove
Global Paket Kaldırma
# npm
npm uninstall -g
# Yarn
yarn global remove
Paket Güncelleme
Bir veya tüm bağımlılıkları en son sürümlerine güncellemek için kullanılır.
# npm (tüm paketleri package.json'daki semver aralığına göre günceller)
npm update
belirli bir paketi güncellemek için
npm update
# Yarn (tüm paketleri package.json'daki semver aralığına göre günceller)
yarn upgrade
belirli bir paketi güncellemek için
yarn upgrade
Küçük/Büyük Sürüm Güncellemeleri
npm ve Yarn’ın update / upgrade komutları, genellikle package.json dosyasındaki semver aralıklarına (örn. ^1.0.0) uygun güncellemeleri yapar. Semver aralığının dışındaki büyük sürüm güncellemeleri için genellikle paketi yeniden eklemek veya package.json dosyasını manuel olarak düzenlemek gerekebilir.
# npm (büyük sürüm güncellemesi için)
npm install @latest
# Yarn (büyük sürüm güncellemesi için)
yarn add @latest
Paket Çalıştırma (Scriptler)
package.json dosyasının scripts bölümünde tanımlanan özel komutları çalıştırmak için kullanılır.
# npm
npm run
'start', 'test' gibi özel scriptler için 'run' kelimesi atlanabilir
npm start
npm test
# Yarn
yarn run
'start', 'test' gibi özel scriptler için 'run' kelimesi atlanabilir
yarn start
yarn test
Önbelleği Temizleme
Paket yöneticisinin indirdiği paketlerin önbelleğini temizlemek için kullanılır. Bu, bazen bozuk kurulum sorunlarını çözebilir.
# npm
npm cache clean --force
# Yarn
yarn cache clean
Versiyon Bilgisi
Yüklü paket yöneticisinin veya belirli bir paketin versiyon bilgilerini görüntülemek için kullanılır.
# npm (npm versiyonu)
npm -v
belirli bir paketin versiyonlarını görmek için
npm view versions
# Yarn (Yarn versiyonu)
yarn -v
belirli bir paketin versiyonlarını görmek için
yarn info versions
Audit/Denetim (Güvenlik)
Projenin bağımlılıklarında bilinen güvenlik açıklarını denetlemek için kullanılır.
# npm
npm audit
bulunan güvenlik açıklarını otomatik olarak düzeltmek için
npm audit fix
# Yarn (Yarn 1 için)
yarn audit
Yarn 2+ için (npm audit komutunu Yarn üzerinden çalıştırır)
yarn npm audit
Workspaces
Monorepo projelerinde, birden fazla paketin tek bir depoda yönetilmesini sağlar. Her iki araç da bu özelliği destekler.
# npm workspaces (package.json'a "workspaces" alanı eklenir)
{
"name": "my-monorepo",
"version": "1.0.0",
"workspaces": [
"packages/*",
"apps/*"
]
}
Bir workspace'e bağımlılık eklemek için
npm install -w
# Yarn workspaces (package.json'a "workspaces" alanı eklenir)
{
"name": "my-monorepo",
"version": "1.0.0",
"private": true,
"workspaces": [
"packages/*",
"apps/*"
]
}
Bir workspace'e bağımlılık eklemek için
yarn workspace add
Diğer Faydalı Komutlar
Eski Bağımlılıkları Listeleme
Güncel olmayan bağımlılıkları listeler.
# npm
npm outdated
# Yarn
yarn outdated
Bağımlılık Ağacını Gösterme
Yüklü bağımlılıkların ağacını gösterir.
# npm
npm ls
belirli bir paketin bağımlılık ağacını görmek için
npm ls
# Yarn
yarn list
belirli bir paketin bağımlılık ağacını görmek için
yarn list
Bir paketin neden yüklendiğini görmek için (Yarn 1)
yarn why
Paket Kayıt Defteri Bilgileri
Varsayılan kayıt defteri URL’sini veya belirli bir paketin kayıt defteri bilgilerini gösterir.
# npm
npm config get registry
npm view repository.url
# Yarn
yarn config get registry
yarn info repository.url
Kök Dizini Bulma
Yüklü paketlerin kök dizinini gösterir.
# npm
npm root
# Yarn
yarn bin
Paket Yayınlama
Bir paketi npm kayıt defterine yayınlamak için kullanılır.
# npm
npm publish
# Yarn
yarn publish
npm ve Yarn Arasındaki Temel Farklar
Komutların benzerliklerine rağmen, npm ve Yarn arasında temel felsefi ve teknik farklılıklar bulunur:
- Performans: Tarihsel olarak, Yarn paketleri paralel olarak indirip kurduğu için npm’den daha hızlıydı. Ancak npm’in son sürümleri (özellikle npm 7 ve sonrası) performans açısından önemli iyileştirmeler yaparak Yarn’a yaklaştı. Yine de, büyük projelerde veya zayıf internet bağlantılarında Yarn’ın çevrimdışı önbelleği ve paralel işleme avantajları hala hissedilebilir.
- Determinizm: Her iki araç da bağımlılık ağacının tam olarak kilitlenmesini sağlayan dosyalara sahiptir:
package-lock.json(npm) veyarn.lock(Yarn). Bu dosyalar, farklı ortamlarda yapılan kurulumların aynı olmasını garanti eder. Bu konuda her iki araç da artık oldukça güçlüdür. - Güvenlik: Yarn, paketlerin bütünlüğünü kontrol etmek için kontrol toplamları kullanır ve kurulum sırasında keyfi kod çalıştırmayı kısıtlayarak ek bir güvenlik katmanı sağlar. npm ise
npm auditkomutuyla bilinen güvenlik açıklarını tarama ve düzeltme yeteneği sunar.
