Takip et

Cheat Sheet: npm ve Yarn Komutları Karşılaştırmalı Kılavuzu

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 teknolojil

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_modules adlı ö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.json dosyası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.json dosyası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 audit gibi 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.lock dosyası 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_modules dizinini 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.lock dosyası, 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_modules yapı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) ve yarn.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 audit komutuyla bilinen güvenlik açıklarını tarama ve düzeltme yeteneği sunar.
Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.