Verdaccio ile NPM Proxy Kullanmak

Tuğsan Ünlü
5 min readMar 3, 2021
Verdaccio

2020'nin son blog yazısında yeni senede daha fazla yazmayı umut etmiştim fakat görünen o ki 2021'e pek iyi bir başlangıç yapamadım. Sonraki aylarda aradaki açığı iyi konu ve yazılarla kapatmak niyetindeyim. Bu yazıda başlıktan da anlaşılacağı üzere projelerimizde kullandığımız bağımlılıklar için bir NPM proxy (vekil) kurulum ve kullanımından bahsedeceğim.

Motivasyon

İlk olarak yine ihtiyacı ve motivasyonu tanımlayarak başlayalım.

Node.js üzerinde koşan veya build işlemlerinin Node.js üzerinde yapıldığı projelerimizin üçüncü parti bağımlılıklarını yönetmek için NPM, Yarn gibi paket yönetim sistemlerini kullanıyoruz. Bu gibi paket yönetim sistemleri, kullanıcıların NPM paketi hâline getirdiği uygulamalarını geçmiş sürümleriyle birlikte registry (kayıt defteri) adı verilen repolarda saklıyorlar. Bir geliştirici, projesine yeni bir paket eklemek istediğinde ilgili repolara başvurulup söz konusu paketler geliştiricinin bilgisayarına indiriliyor. Uygulama içerisindeki yönteme göre de node_modules dizini altından ihtiyaç duyulan modüllere başvurularak paketleme işlemleri yapılıyor.

NPM için varsayılan registry adresini npm config üzerinden görmek mümkün.

Varsayılan NPM registry

Neden?

Peki, biz kendi NPM registry’imizi kuramaz mıyız? Ya da buna hangi durumlarda ihtiyacımız olabilir?

Geliştiricisi olduğumuz birden fazla proje düşünelim. Bu projeler içerisindeki kimi ihtiyaçlar birbirine benzer, hatta bire bir aynı dahi olabilirler. Böyle bir senaryoda ihtiyacın oluştuğu ilk projede yapılan geliştirmeyi diğer projelere kopyalama yöntemine başvurabiliriz. Ekseriyetle ilk akla gelen bu çözüm, uygulandığı an için hızlı bir şekilde sonuca ulaştırsa da sonrası için tam bir kaos sebebidir.

Şöyle ki, A projesinde yaptığımız bir geliştirme, B projesinde de bizden talep edildiği için ilgili yerden kopyalayarak kullandık diyelim. Hatta yetmedi, C ve D projelerine de uyguladık. Bir ay sonra A projesinde yaptığımız geliştirmede hata olduğunu öğrendik. Hazırladığımız çözüm için herhangi bir sürüm kontrolü yapmadığımız için müdahale edilmesi gereken nur topu gibi dört farklı projemiz oldu.

Benzer şekilde, bir çalışma arkadaşımızın daha önce geliştirdiği çözüme ihtiyacımız olabilir. Her defasında hâlihazırda yapılmış bir geliştirmeyi yeniden yapmak yerine doğrudan kendi registry’imizde yayımlanmış ilgili paketi kullanabiliriz.

Bunlar zaten NPM, Yarn, Composer gibi paket yönetim sistemlerinin altında yatan temel fikirler. Tüm bu işlemleri herhangi bir araca ihtiyacımız olmadan kamuya açık bir şekilde veya ücreti mukabilinde bir hizmet alıp kendimize özel olarak da yapabilmemiz mümkün.

Verdaccio, yukarıda saydığım tüm özellikleri bünyesinde barındıran, açık veya kapalı registry’ler oluşturmaya imkân tanıyan özgür bir yazılım. Verdaccio ile kendi bilgisayarımıza veya uzaktaki bir bilgisayara registry kurulumu yapabiliyor, NPM paketlerimizi oluşturup yayımlayabiliyor ve yayımlanan paketleri uygulamalarımıza dâhil edebiliyoruz.

Kurulum

İlk olarak NPM veya Yarn üzerinden Verdaccio’yu global olarak kuruyoruz.

Kurulum

Komut Satırı ve Web Arayüzü

Kurulum tamamlandıktan sonra komut satırı aracı marifetiyle Verdaccio uygulamasını ayağa kaldırıyoruz.

CLI

Verdaccio, varsayılan olarak http://localhost:4873 adresi üzerinden çalışmaya başlıyor.

Loglar

İlgili adresi tarayıcıdan açtığımızda React ile yazılmış temiz SPA arayüzü bizi karşılıyor. Şu anda registry’imize kayıtlı bir kullanıcı veya paket olmadığı için yönergeler yardımıyla işe koyulmamızı bekliyor.

Verdaccio web arayüzü

Kullanıcı Oluşturma

Yeni bir kullanıcı kaydı yaparak işe başlıyoruz. Bundan sonraki süreç, tıpkı NPM üzerinde herkese açık bir paket yayımlıyormuşçasına devam ediyor. Kullanıcımızın kullanıcı adı, parola ve e-posta adresi bilgilerini girerek kaydı tamamlıyoruz. Kaydın akabinde oturumumuz açılmış oluyor.

Yeni kullanıcı oluşturma

Kullanıcı bazlı NPM tercihlerinin tutulduğu .npmrc dosyasını incelediğimizde kullanıcımızın oluşturulduğunu ve bir authentication (kimlik doğrulama) token’ı aldığını görüyoruz. Bu token bilgisi, bundan sonraki işlemlerimizin yetkili bir kullanıcı üzerinden devam edeceğini bize söylüyor.

Kullanıcı yetkilendirmesi

Paket Yayımlama

Hızlıca kendi registry’mize kaydedeceğimiz ilk NPM paketini hazırlayalım.

Proje oluşturma

Metin döndürecek basit bir fonksiyon yazalım.

index.js

Akabinde bu paketi anlatan bir README dosyası hazırlayalım.

README.md

npm publish komutuyla bulunduğumuz dizin içerisindeki dosyaları paketleyerek bir NPM paketi hâline getirelim ve registry’imizde yayımlayalım.

Burada dikkat etmemiz gereken nokta --registry argümanı. Bu argümanla ilgili paketin varsayılan NPM registry’sinde değil, Verdaccio ile kurduğumuz kendi registry’imizde yayımlanacağını belirtmiş olduk.

Paket yayımlama

Tekrar Verdaccio’nun web arayüzüne döndüğümüzde yayımladığımız paketi görebiliyoruz.

Verdaccio web arayüzü paket listesi

Paketin detayına girdiğimizde ise yazdığımız README, varsa paketimizin üçüncü parti bağımlılıkları, geçmiş versiyonları, geliştirici ve sürüm bilgilerini de görüntüleyebiliyoruz.

Verdaccio web arayüzü paket detayı

Yayımladığımız paketi projelerimiz içerisinde kullanmak istediğimizde yine --registry argümanıyla Verdaccio’nun adresini vererek kurabiliyoruz.

Verdaccio üzerinden paket kurulumu

Namespace Oluşturmak

Verdaccio’ya paket yayımlamak veya kurmak için her başvurmak istediğimizde --registry argümanını kullanmak meşakkatli ve çoğu zaman da unutulmaya ve hataya teşne olacaktır. Bunun için paket isimlerinde uyacağımız bir konvansiyon işimizi epey kolaylaştırır.

Yine .npmrc dosyasında yapacağımız şu ufak tanımlama, “@tugsanunlu/” ile başlayan paketlerle ilgili işlemleri NPM’in varsayılan registry’sinden talep etmek yerine doğrudan Verdaccio’dan talep edecektir. Bu sayede her işlemde registry belirtme zahmetinden kurtulmuş olduk.

Namespace oluşturmak

Özet

  • Verdaccio, özellikle kurumlar içerisindeki takımların ve geliştiricilerin ortak çözümlerini merkezi bir yerde depolamaları konusunda oldukça kullanışlı bir araç. Hazırlanan paketleri kamuya açık olarak yayımlamaya imkân tandığı gibi yalnızca yetkili kullanıcıların paket yayımlayabileceği ve kurabileceği şekilde de yapılandırılabiliyor.
  • Temiz ve hızlı bir web arayüzü var. Tema desteği var. Birçok dil destekliyor. Türkçe desteği henüz yok gibi gözükse de geçtiğimiz aylarda Türkçe desteğini ekledim. Bir sonraki güncellemede Türkçe olarak da kullanılabilecek.
  • Mevcut NPM paketlerini override edip yeni paket oluşturabilme ve önbellekleme gibi özellikleri mevcut.
  • Ekseriyetle hâlihazırda çözümlerini kamuya açık bir şekilde yayımlayan geliştiricilerden ziyade, muhtelif sebeplerden ötürü bunları doğrudan yap(a)mayan fakat NPM’in nimetlerinden de faydalanmak isteyenleri hedefliyor.
  • NPM’in yanında Yarn ve pnpm gibi paket yönetim sistemlerini de destekliyor.
  • Docker ve Kubernetes Helm desteği sayesinde DevOps süreçlerine hızlıca adapte olabiliyor.
  • Güçlü bir topluluğu var ve Storybook, Create React App, Gatsby, Apollo GraphQL gibi projeler tarafında da kullanılmakta.

Kaynaklar

https://github.com/verdaccio/verdaccio
https://verdaccio.org/docs/en
https://www.youtube.com/watch?v=hDIFKzmoCaA
https://www.youtube.com/watch?v=oVCjDWeehAQ

--

--