Yarn veya Npm'den Pnpm'ye nasıl geçiş yapılır?


yazıldı

2 dakika okuma süresi

Cover Image for Yarn veya Npm'den Pnpm'ye nasıl geçiş yapılır?

Yarn'a o kadar alışmıştım ki etrafta daha yeni bir alternatif var mı diye hiç araştırma yapma gereği duymamıştım.

Pnpm, görünüşe göre bağımlılıkları çekme, çözme ve depolamada daha performanslı. Mevcut site projemde node_modules klasörünü silerek bağımlılıkları tekrar çektim ve gerçekten yarn'a göre bariz bir şekilde hızlı görünüyor. Ayrıca pnpm'ye geçiş yapması da kullanması da çok kolay çünkü daha önce npm veya yarn kullanan biri için komutların pek bir farkı yok.

Geçiş

Geçiş yapmak için aşağıdaki komutları kullandım:

  1. Öncelikle pnpm'yi yüklemeniz gerekiyor. Ben AUR deposundan yükledim. Kurulum bilgilerine buradan ulaşabilirsiniz.
  2. Daha sonra node_modules klasörünü sildim. Pnpm node_modules içerisinde sembolik linkler kullandığı için mevcut klasörü silmemiz gerekiyor.
  3. pnpm import komutunu çalıştırarak mevcut yarn.lock veya packages-lock.json dosyasını kullanarak pnpm-lock.yaml dosyasını oluşturuyoruz.
  4. Daha sonra yarn.lock veya packages-lock.json hangisi varsa onu siliyoruz.
  5. Son olarak pnpm install komutu ile bağımlılıkları yüklüyoruz.

Eğer herhangi bir yerde yarn veya npm kullandıysanız da bunu pnpm olarak değiştirmeniz gerekiyor.

Sorunlar

Bağımlılık Sorunu

Geçiş yapar yapmaz sitemi Netlify üzerinden tekrar oluşturmaya çalıştım fakat her seferinde Spotify için kullandığım fonksiyonda hata verdi. superagent modülünü bulamamaktan şikayetçiydi fakat o fonksiyondan direkt olarak superagent modülünü çağırmıyordum ve halihazırda o modül başka bir paketin bağımlılığı olarak yüklenmişti zaten, yani bulabilmesi gerekiyordu.

Yarn ile kurulum yaparken, tüm paketler node_modules klasörünün kök dizinine ekleniyor. Sonuç olarak kod içerisinden, projeye direkt bağımlılık olarak eklenmemiş fakat başka paketlere bağımlılık olarak yüklenmiş modülleri de çağırabiliyoruz. Fakat pnpm, yalnızca projenin doğrudan bağımlılıklarını bu klasörün kök dizinine farklı bir klasörden sembolik link olarak ekliyor. Yani bağımlılık olarak eklemeden diğer modülleri çağıramıyoruz.

Özetle, eğer A paketinden B paketini çağırıyorsanız ve B paketi package.json içerisinde bağımlılık olarak (dependencies veya devDependencies) belirtilmemişse A paketi çalışırken hata verecektir B paketini bulamayacağı için.

Benim durumumda, sitemdeki ne dinliyorum kısmı için kullandığım spotify-web-api-node paketi superagent'i kullandığı için ve ben bunu package.json içerisinde direkt bağımlılık olarak eklemediğimden superagent'i bulamadı ve hata verdi. pnpm add superagent@7 diyerek bu sorunu ortadan kaldırdım.

Github Dependabot Sorunu

Görünüşe göre Dependabot henüz pnpm paketini desteklemiyor, dolayısıyla dependabot pnpm-lock.yaml dosyasını inceleyip size güvenlik sorunları konusunda uyarı yapamayacak. Bu durumda ya pnpm'nin eklemesini bekleyeceksiniz ya da alternatiflerine (Renovate gibi) yöneleceksiniz. Bu konuda açılmış başlığı buradan takip edebilirsiniz: #1736

Pnpm komutları

AçıklamaKomutAlternatif Komut
Bağımlılıkları yüklerpnpm installpnpm i
Bağımlılık eklerpnpm add <paket>
Bağımlılıkları güncellerpnpm updatepnpm up | upgrade
Belirtilen paketi kaldırırpnpm removepnpm rm | un | uninstall
Belirtilen pakete bağımlı olan tüm paketleri gösterirpnpm why <paket>
Güncelliğini yitirmiş paketleri kontrol ederpnpm outdated
Tüm paketleri ve onların bağımlılıklarını listelerpnpm listpnpm ls
Gereksiz paketleri kaldırırpnpm prune

Sonuç

Yavaş yavaş projelerimi pnpm'ye geçirmeye başladım. Terminalde pnpm yazmak garip bir şekilde bana zor ve uzun geliyor (yarn ile aynı harf sayısına sahip olmasına rağmen), bundan dolayı zsh içerisinde alias pnpm=pn şeklinde bir alias oluşturdum (henüz elim alışmadı).