pnpm Nedir ve Neden Kullanılmalıdır?
Node.js projelerinde bağımlılık yönetimi yaparken, her proje aynı paketlerin kendi kopyalarını sakladığında beklenmedik şekilde çok fazla disk alanı tüketilebilir. pnpm (performant npm), bu sorunu paket dosyalarını içerik adresli paylaşılan bir depoda saklayarak ve her projeye bunları bağlantı yoluyla dahil ederek çözer. Bu sayede aynı paket versiyonunu kullanan 10 farklı proje, aslında diskte sadece bir kez saklanır.
pnpm, npm kayıt defterini (registry) kullanır ve package.json dosyalarıyla uyumlu çalışır. Bunun yanı sıra daha sıkı bağımlılık yönetimi sunar ve içsel workspace destekleri sayesinde monorepo projelerinde verimliliği artırır. Özellikle büyük ekipler ve çok sayıda projeyi aynı anda yöneten geliştiriciler için ideal bir çözümdür.
Önemli: pnpm, npm'in yerini almaz ancak disk kullanımı ve bağımlılık yönetimi konusunda önemli avantajlar sunar. Eğer projelerinizde disk alanı sorunu yaşıyorsanız veya bağımlılık çatışmalarından bıktıysanız pnpm mükemmel bir alternatif olacaktır.
pnpm Kurulumu (Linux, macOS, Windows)
Zorluk Seviyesi: Başlangıç (Beginner)
pnpm 11 kullanabilmek için Node.js 22.13 veya daha yeni bir versiyona ihtiyacınız vardır. Mevcut Node.js versiyonunuzu kontrol edin:
node --version
Eğer uygun bir Node.js versiyonuna sahip değilseniz, aşağıdaki kaynaklardan yardımcı olabilirsiniz:
- Ubuntu 26.04 için Node.js kurulum rehberi
- Diğer sistemler için Node.js versiyon yöneticisi kullanabilirsiniz (örn: nvm, fnm).
1. Corepack ile Kurulum (Önerilen Yöntem)
Corepack, paket yöneticisi versiyonlarını yönetir ve projenizin package.json dosyasında kaydedilen pnpm versiyonunu otomatik olarak seçer. Öncelikle Corepack'ı güncelleyin:
npm install --global corepack@latest
Ardından pnpm şim (shim)ını etkinleştirin:
corepack enable pnpm
Projeniz için pnpm versiyonunu sabitleyin:
corepack use pnpm@latest-11
Bu komut, package.json dosyanıza aşağıdaki gibi bir packageManager girişi ekleyecektir:
{
"packageManager": "pnpm@11.5.2"
}
Bu sayede ekip arkadaşlarınız ve CI sistemleri otomatik olarak aynı pnpm versiyonunu kullanacaktır.
2. npm ile Global Kurulum
Eğer tercih ederseniz, pnpm'i global olarak npm ile de kurabilirsiniz:
npm install --global pnpm@latest-11
Not: Bu yöntemle kurulan pnpm, projeye özel versiyon yönetimi yapmaz. Herkes aynı global pnpm versiyonunu kullanacaktır.
3. Bağımsız Kurulum (Node.js Gerektirmez)
Bağımsız kurulum, Node.js olmadan da pnpm kullanmanızı sağlar. Linux ve macOS için:
curl -fsSL https://get.pnpm.io/install.sh | sh -
Uyarı: Uzaktan bir betiği doğrudan shell'e yönlendirmek, ağdan gelen kodu kullanıcı olarak çalıştırmanıza neden olur. Üretim sistemlerinde bu betiği çalıştırmadan önce inceleyin veya önce indirip yerel dosyayı kontrol edin.
Windows PowerShell için:
Invoke-WebRequest https://get.pnpm.io/install.ps1 -UseBasicParsing | Invoke-Expression
Kurulum tamamlandıktan sonra yeni bir terminal açın ve pnpm versiyonunu kontrol edin:
pnpm --version
11.5.2
Proje Başlatma ve Paket Yükleme
Zorluk Seviyesi: Başlangıç (Beginner)
1. Yeni Bir Proje Başlatma
Yeni bir proje dizini oluşturun ve package.json dosyasını başlatın:
mkdir my-app
cd my-app
pnpm init
pnpm init komutu, paket metadata'si için sorular sorar ve sonuçları package.json dosyasına yazar. Eğer npm ile oluşturulmuş bir projeniz varsa, pnpm mevcut package.json dosyasını kullanabilir ve herhangi bir dönüştürme işlemine gerek yoktur.
2. Paket Yükleme
Bir çalışma zamanı bağımlılığı eklemek için pnpm add komutunu kullanın:
pnpm add express
Bu komut, paketi yükler, package.json dosyanızın dependencies bölümüne kaydeder ve pnpm-lock.yaml dosyasını oluşturur veya günceller.
Geliştirme araçları eklemek için -D (veya --save-dev) bayrağını kullanın:
pnpm add -D eslint
Belirli bir paket versiyonunu yüklemek için versiyon numarasını @ işareti ile belirtin:
pnpm add express@5.1.0
3. Mevcut Bir Projeyi Klonlama
pnpm kullanılarak oluşturulmuş bir projeyi klonladığınızda, tüm bağımlılıkları yüklemek için:
pnpm install
CI ortamlarında veya tekrarlanabilir ortamlarda pnpm-lock.yaml dosyasının değiştirilmemesini sağlamak için:
pnpm install --frozen-lockfile
Bu komut, package.json ve pnpm-lock.yaml dosyalarının uyumlu olmadığı durumlarda yeni bir bağımlılık ağacı oluşturmaya çalışmak yerine hata verir.
Global Paket Yükleme ve Komutları Çalıştırma
Zorluk Seviyesi: Başlangıç (Beginner)
1. Global Paket Yükleme
Komut satırı aracı olarak kullanılacak paketleri global olarak yükleyin:
pnpm add -g http-server
Eğer pnpm global ikili (binary) dizinini bulamazsa, aşağıdaki komutu çalıştırın:
pnpm setup
Ardından yeni bir terminal açarak global paket yükleme işlemini tekrarlayın. Uygulama bağımlılıklarını her zaman proje içerisinde yerel olarak saklayın ve global yüklemeleri sadece farklı projeler arasında kullanılan komutlar için saklayın.
2. Paket Komutlarını ve Betiklerini Çalıştırma
package.json dosyasındaki scripts bölümünde tanımlanan komutları çalıştırmak için:
{
"scripts": {
"start": "node index.js",
"lint": "eslint ."
}
}
Belirtilen komutu çalıştırmak için:
pnpm run lint
Eğer komut adı pnpm komutlarıyla çakışmıyorsa, run kelimesini atlayabilirsiniz:
pnpm start
Mevcut proje içerisinde yüklü olan bir paketin ikili dosyasını çalıştırmak için:
pnpm exec eslint .
Geçici olarak bir paketi çalıştırmak ve yerel olarak yüklememek için pnpm dlx komutunu kullanın:
pnpm dlx create-vite@latest my-app
pnpm exec, mevcut proje içerisinde yüklü olan bir bağımlılığı çalıştırırken, pnpm dlx geçici olarak bir paketi indirir ve komutunu çalıştırır.
npm'den pnpm'e Geçiş
Zorluk Seviyesi: Orta (Intermediate)
npm kullanılarak oluşturulmuş bir projeyi pnpm'e geçirmek için aşağıdaki adımları izleyin:
-
npm kilit dosyasını pnpm kilit dosyasına dönüştürün:
pnpm importBu komut, mevcut
package-lock.jsondosyasını okuyarakpnpm-lock.yamldosyasını oluşturur. -
Bağımlılıkları yükleyin:
pnpm installProjenizin testlerini ve derlemelerini çalıştırarak her şeyin düzgün çalıştığından emin olun.
-
npm kilit dosyasını kaldırın:
rm package-lock.jsonpnpm-lock.yamldosyasını commit edin ve CI komutlarınınpm ci'denpnpm install --frozen-lockfile'e güncelleyin. -
Paket yöneticisini güncelleyin (isteğe bağlı):
corepack use pnpm@latestBu adım, projenizin
package.jsondosyasına pnpm versiyonunu kaydeder ve ekip arkadaşlarınızın aynı versiyonu kullanmasını sağlar.
pnpm Workspace'leri ile Çoklu Paket Yönetimi
Zorluk Seviyesi: İleri (Advanced)
pnpm workspace'leri, birden fazla paketi aynı depoda yönetmenizi sağlar. Bu yapı, monorepo projelerinde oldukça kullanışlıdır. Öncelikle, workspace yapılandırmasını tanımlayın:
# pnpm-workspace.yaml
packages:
- 'apps/*'
- 'packages/*'
Ardından, tüm workspace paketleri için bağımlılıkları kök dizinden yükleyin:
pnpm install
Tüm paketlerde tanımlı komutları çalıştırmak için:
pnpm --recursive run build
Belirli bir paket için komut çalıştırmak isterseniz, --filter bayrağını kullanın:
pnpm --filter web-app add zod
pnpm --filter web-app run test
--filter bayrağı, paketleri isim, dizin, bağımlılık ilişkisi veya değiştirilen dosyalar gibi çeşitli yöntemlerle seçmenizi sağlar. Bu özellik, büyük monorepo projelerinde ve CI ortamlarında oldukça kullanışlıdır.
Sık Karşılaşılan Sorunlar ve Çözümleri
1. pnpm: komut bulunamadı
Sorun: pnpm kurulumundan sonra komut bulunamıyor.
Çözüm: Shell'inizin PATH'ini yeniden yüklemesi için yeni bir terminal açın. Bağımsız veya global kurulum yaptıysanız, aşağıdaki komutu çalıştırın:
pnpm setup
Ardından terminali yeniden başlatın ve pnpm --version komutuyla versiyonu kontrol edin.
2. ERR_PNPM_UNSUPPORTED_ENGINE
Sorun: Kurulu pnpm veya proje paketlerinden biri farklı bir Node.js versiyonu gerektiriyor.
Çözüm: Node.js versiyonunu yükseltin veya bağımsız pnpm kurulumunu kullanın. pnpm 11, npm veya Corepack ile kurulduğunda Node.js 22.13 veya daha yeni bir versiyon gerektirir.
3. npm ile çalışan paket, pnpm ile çalışmıyor
Sorun: Bir paket npm ile çalışırken pnpm ile çalışmıyor.
Çözüm: Paket, npm'in daha düz node_modules yapısına güveniyor olabilir. Paketin kendi package.json dosyasında bildirilmeyen bir geçiş bağımlılığına sahip olabilir. Eksik paketi doğrudan bağımlılık olarak ekleyin.
4. CI ortamında ERR_PNPM_OUTDATED_LOCKFILE
Sorun: Commit edilenpnpm-lock.yamldosyasıpackage.jsonile uyumlu değil.
Çözüm: Yerel olarak pnpm install komutunu çalıştırın, güncellenen kilit dosyasını inceleyin ve commit edin. Ardından CI ortamında pnpm install --frozen-lockfile komutunu çalıştırın.
Sonuç
pnpm, npm paket ekosistemini kullanırken disk alanını optimize eder ve daha net bağımlılık bildirimleri sunar. Eğer farklı iş akışlarını karşılaştırmak istiyorsanız, npm komut rehberine göz atabilirsiniz.
Artık pnpm kullanarak projelerinizi daha verimli bir şekilde yönetebilir ve disk alanından tasarruf edebilirsiniz. İyi kodlamalar!


