Ubuntu 22.04 Üzerinde nvm ile Node.js Sürüm Yönetimi
Bir geliştirici olarak farklı projeler üzerinde çalışıyorsanız, muhtemelen şu durumu yaşamışsınızdır: Bir projen Node.js 14 gerektiriyor, diğeri 18, bir yenisi de en güncel LTS sürümünü istiyor. Sistem geneline tek bir Node.js sürümü kurmak bu senaryoda tam bir kaosa davetiye çıkarır. İşte tam bu noktada nvm (Node Version Manager) hayat kurtarıcı oluyor. Bu yazıda Ubuntu 22.04 üzerinde nvm kurulumundan başlayarak, birden fazla Node.js sürümü yönetmeye kadar her şeyi ele alacağız.
nvm Nedir ve Neden Kullanmalıyız?
nvm, birden fazla Node.js sürümünü aynı sistem üzerinde yönetmenizi sağlayan bir kabuk betiğidir. apt ile kurulan standart Node.js kurulumundan temel farkı şudur: Sistem genelinde tek bir sürüm yerine, kullanıcı bazında ve hatta proje bazında farklı sürümler kullanabilirsiniz.
Neden nvm tercih etmeliyiz?
- Sürüm çakışması yok: Her proje kendi Node.js sürümüyle çalışır
- Root yetkisi gerekmez: Global paketleri bile sudo olmadan kurabilirsiniz
- Hızlı geçiş: Tek komutla sürümler arası geçiş yapılır
.nvmrcdesteği: Projeye özel sürüm dosyası ile ekip standardizasyonu sağlanır- Kolay geri alma: Bir sürümü silmek veya eski sürüme dönmek saniyeler alır
Özellikle birden fazla projesi olan geliştiriciler, CI/CD pipeline kuran DevOps ekipleri ve farklı ortamları taklit etmesi gereken sysadminler için nvm vazgeçilmez bir araçtır.
Ön Hazırlık ve Sistem Gereksinimleri
Ubuntu 22.04 üzerinde nvm kurmadan önce birkaç bağımlılığın sistemde mevcut olduğundan emin olalım.
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget git build-essential
build-essential paketi önemli; bazı Node.js paketleri native C/C++ eklentileri derlediğinden bu araçlara ihtiyaç duyar. Bunu baştan kurmak ilerleyen süreçte yaşanabilecek derleme hatalarının önüne geçer.
Eğer sistemde daha önce apt üzerinden kurulmuş bir Node.js varsa, çakışmaları önlemek için onu kaldırmanızı tavsiye ederim:
sudo apt remove -y nodejs npm
sudo apt autoremove -y
Ayrıca kullanıcı dizininde kalan eski npm yapılandırma dosyalarını da temizleyelim:
rm -rf ~/.npm
rm -rf ~/.node_modules
nvm Kurulumu
nvm’i kurmanın en güvenilir yolu, resmi GitHub deposundaki kurulum betiğini kullanmaktır. Yazı hazırlanırken güncel sürüm 0.39.x’ti; siz okurken daha yeni bir sürüm çıkmış olabilir. Güncel sürümü [github.com/nvm-sh/nvm](https://github.com/nvm-sh/nvm) adresinden kontrol edebilirsiniz.
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
Ya da wget tercih ediyorsanız:
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
Kurulum betiği çalıştıktan sonra ~/.bashrc (veya ~/.zshrc kullanıyorsanız zsh için) dosyasına otomatik olarak gerekli satırları ekler. Bu değişikliklerin aktif olması için mevcut terminal oturumunu yenilemeniz gerekiyor:
source ~/.bashrc
Zsh kullanıyorsanız:
source ~/.zshrc
Kurulumun başarılı olup olmadığını doğrulayalım:
nvm --version
Çıktı olarak 0.39.7 gibi bir sürüm numarası görüyorsanız kurulum tamamdır. command not found hatası alıyorsanız terminali tamamen kapatıp yeniden açmayı deneyin.
nvm’in Eklediği Satırlar Hakkında
Kurulum betiği ~/.bashrc dosyasına şu satırları ekler:
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion"
Bu satırlar nvm’i her terminal oturumunda otomatik olarak yükler. NVM_DIR değişkeni, nvm’in kurulu olduğu dizini belirtir; varsayılan olarak ~/.nvm kullanılır.
Node.js Sürümlerini Listeleme ve Kurma
nvm kurulduktan sonra ilk yapacağımız şey mevcut Node.js sürümlerine bakmak olacak.
Uzak Sürümleri Listeleme
# Tüm mevcut sürümleri listele (çok uzun bir liste gelir)
nvm ls-remote
# Sadece LTS sürümlerini listele
nvm ls-remote --lts
# Belirli bir major sürümün tüm versiyonlarını listele
nvm ls-remote 18
LTS sürümleri üretim ortamları için tavsiye edilir; daha uzun süre güvenlik güncellemesi alırlar. Güncel development projeleriniz için ise current sürümü tercih edebilirsiniz.
Node.js Kurma
Şimdi birkaç farklı sürüm kuralım. Gerçek dünya senaryosunu canlandıralım: Şirketimizde üç proje var, biri eski Node.js 14 gerektiriyor, diğeri Node.js 18 LTS üzerinde, üçüncüsü ise en yeni Node.js 20 LTS ile geliştiriliyor.
# En son LTS sürümünü kur (bu yazı hazırlanırken 20.x)
nvm install --lts
# Belirli bir LTS kod adıyla kur
nvm install lts/iron # Node.js 20.x
nvm install lts/hydrogen # Node.js 18.x
# Belirli bir sürüm numarasıyla kur
nvm install 14.21.3
# Sadece major sürüm belirtmek de yeterli (en son minor/patch'i kurar)
nvm install 16
nvm install 18
nvm install 20
Kurulum sırasında nvm, Node.js ikili dosyasını indirir ve ~/.nvm/versions/node/ dizinine kurar. Her sürüm kendi bağımsız dizininde yaşar, bu sayede birbirini etkilemezler.
Kurulu Sürümleri Görme
nvm ls
Çıktı şuna benzer görünür:
v14.21.3
v16.20.2
v18.19.0
-> v20.11.0
system
default -> lts/* (-> v20.11.0)
lts/* -> lts/iron (-> v20.11.0)
lts/iron -> v20.11.0
lts/hydrogen -> v18.19.0
Ok işareti (->) aktif sürümü gösterir. system ise sistemde apt ile kurulu olan Node.js sürümünü temsil eder.
Sürümler Arası Geçiş Yapma
İşte nvm’in en sık kullandığınız özelliği: Anlık sürüm değiştirme.
# Belirli bir sürüme geç
nvm use 14
# Tam sürüm numarasıyla geç
nvm use 18.19.0
# En son LTS'ye geç
nvm use --lts
# Sistem kurulumuna dön
nvm use system
Geçişin başarılı olduğunu doğrulamak için:
node --version
npm --version
Dikkat etmesi gereken önemli bir nokta var: nvm use komutu yalnızca mevcut terminal oturumu için geçerlidir. Yeni bir terminal açtığınızda default sürüm devreye girer.
Default Sürümü Belirleme
Yeni terminal oturumlarında otomatik olarak kullanılacak sürümü ayarlamak için:
# Belirli bir sürümü default yap
nvm alias default 20
# LTS'yi default olarak ayarla
nvm alias default lts/*
# Node.js 18'i default yap
nvm alias default 18
Alias sistemi çok kullanışlıdır. Kendi özel alias’larınızı da oluşturabilirsiniz:
nvm alias production 18.19.0
nvm alias development 20.11.0
# Kullanımı
nvm use production
nvm use development
# Tüm alias'ları listele
nvm alias
Proje Bazlı Sürüm Yönetimi: .nvmrc Dosyası
Takım ortamında çalışıyorsanız .nvmrc dosyası gerçekten hayat kurtarır. Projenin root dizininde bu dosyayı oluşturarak ekipteki herkesin aynı Node.js sürümünü kullanmasını zorunlu kılabilirsiniz.
# Proje dizinine git
cd /home/kullanici/projeler/my-api
# .nvmrc dosyasını oluştur
echo "18.19.0" > .nvmrc
# Ya da sadece major sürüm de yeterli
echo "18" > .nvmrc
# .nvmrc dosyasını okuarak ilgili sürümü aktif et
nvm use
nvm use komutunu argümansız çalıştırdığınızda, nvm bulunduğunuz dizinde ve üst dizinlerde .nvmrc dosyasını arar. Bulursa o sürümü aktive eder.
Eğer .nvmrc‘de belirtilen sürüm sistemde kurulu değilse hata alırsınız. Hem kur hem aktive et için:
nvm install
Bu komut da .nvmrc dosyasını okur; sürüm kurulu değilse önce kurar, sonra aktive eder.
Otomatik Sürüm Değiştirme
Dizin değiştirdiğinizde otomatik olarak .nvmrc‘yi okuyup sürümü değiştirmesini istiyorsanız, ~/.bashrc dosyasına şu fonksiyonu ekleyebilirsiniz:
# ~/.bashrc dosyasına ekle
autoload_nvmrc() {
local nvmrc_path
nvmrc_path="$(nvm_find_nvmrc)"
if [ -n "$nvmrc_path" ]; then
local nvmrc_node_version
nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")
if [ "$nvmrc_node_version" = "N/A" ]; then
nvm install
elif [ "$nvmrc_node_version" != "$(nvm version)" ]; then
nvm use
fi
elif [ -n "$(PWD=$OLDPWD nvm_find_nvmrc)" ] && [ "$(nvm version)" != "$(nvm version default)" ]; then
echo "nvmrc bulunamadı, default sürüme dönülüyor"
nvm use default
fi
}
cd() {
builtin cd "$@" && autoload_nvmrc
}
Değişikliği uygulamak için:
source ~/.bashrc
Artık bir proje dizinine cd ile girdiğinizde, eğer .nvmrc varsa otomatik olarak ilgili sürüme geçecektir.
Global Paketler ve Sürüm Yönetimi
nvm ile kurduğunuz her Node.js sürümünün kendi bağımsız global paket alanı vardır. Yani Node.js 18 için npm install -g pm2 yaparsanız, Node.js 20’ye geçtiğinizde pm2 global olarak mevcut olmayacaktır.
Bu can sıkıcı olabilir. Çözüm yolları:
# Mevcut sürümdeki global paketleri listele
npm list -g --depth=0
# Yeni sürüm kurulurken önceki sürümün global paketlerini aktar
nvm install 20 --reinstall-packages-from=18
# Mevcut sürümdeki global paketleri yeni sürüme kopyala
nvm install 20
nvm reinstall-packages 18
Sık kullandığım global paketleri bir scripte dökmenizi de tavsiye ederim:
#!/bin/bash
# global-packages.sh
NODE_VERSION=${1:-20}
nvm use $NODE_VERSION
npm install -g
pm2
nodemon
typescript
ts-node
eslint
prettier
@nestjs/cli
serve
Bu scripti yeni bir Node.js sürümü kurduğunuzda çalıştırarak standart araçlarınızı hızlıca kurabilirsiniz.
Gerçek Dünya Senaryosu: CI/CD Pipeline Entegrasyonu
Bir e-ticaret şirketinde çalıştığınızı düşünelim. Üç farklı Node.js servisi var: Eski bir monolith Node 14’te, modern microservices Node 18’de, ve yeni geliştirilmekte olan bir servis Node 20’de çalışıyor. Jenkins veya GitLab CI kullanan bir pipeline’da nvm nasıl kullanılır?
#!/bin/bash
# ci-build.sh
# nvm'i CI ortamına yükle
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
# Proje dizinine git
cd /workspace/my-service
# .nvmrc'den sürümü oku ve kur/aktive et
nvm install
nvm use
# Sürümü logla
echo "Aktif Node.js sürümü: $(node --version)"
echo "Aktif npm sürümü: $(npm --version)"
# Bağımlılıkları kur
npm ci
# Testleri çalıştır
npm test
# Build al
npm run build
Bu script, her servis için cd ile o dizine girip nvm install && nvm use dediğinizde .nvmrc‘deki sürümü otomatik kullanır. CI ortamında da tutarlılık sağlanmış olur.
Sürüm Güncelleme ve Temizlik
Zamanla kullanmadığınız sürümler birikir ve disk alanı tüketir. Düzenli temizlik yapmakta fayda var.
# Kullanılmayan bir sürümü kaldır
nvm uninstall 14.21.3
# Sadece major sürüm belirterek de kaldırabilirsiniz
nvm uninstall 14
# Tüm kurulu sürümleri gör
nvm ls
# En son LTS'ye güncelle
nvm install --lts
nvm alias default lts/*
# Eski sürümü kaldır
nvm uninstall 18.17.0
nvm’in kendisini güncellemek için ise kurulum komutunu tekrar çalıştırmak yeterlidir; mevcut kurulumu ve sürümleri silmez:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
Sık Karşılaşılan Sorunlar ve Çözümleri
“nvm: command not found” Hatası
En yaygın sorun budur. ~/.bashrc dosyasına bakın:
cat ~/.bashrc | grep nvm
nvm satırları yoksa, kurulum betiği farklı bir dosyaya yazmış olabilir. Kontrol edin:
cat ~/.bash_profile | grep nvm
cat ~/.profile | grep nvm
Satırlar oradaysa ve yine de çalışmıyorsa, ~/.bashrc dosyasının başında erken return ifadesi olup olmadığını kontrol edin; bu satır nvm’nin yüklenmesini engelleyebilir.
Npm Global Paketlerin Bulunmaması
# Hangi dizinden çalıştığını kontrol et
which node
which npm
# nvm sürümünü kontrol et
nvm current
Eğer which node çıktısı /usr/bin/node gösteriyorsa, sistem Node.js’i kullanıyorsunuz demektir. nvm use ile doğru sürüme geçin.
Yavaş Terminal Açılışı
nvm’in ~/.bashrc‘ye eklenmesi terminal açılışını biraz yavaşlatabilir. Zsh kullanıyorsanız lazy loading ile bunu çözebilirsiniz:
# ~/.zshrc içinde nvm'yi lazy load et
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" --no-use
--no-use flag’i nvm’yi yükler ama default Node.js sürümünü aktive etmez. İlk node veya nvm komutunu çalıştırdığınızda devreye girer.
npm EACCES Permission Hatası
nvm kullanırken genellikle bu hatayla karşılaşmazsınız çünkü paketler kullanıcı dizinine kurulur. Eğer yine de görürseniz:
# npm prefix'ini kontrol et
npm config get prefix
# Doğru değer şuna benzer olmalı:
# /home/kullanici/.nvm/versions/node/v20.11.0
Eğer /usr gibi sistem dizini gösteriyorsa, nvm use ile doğru sürüme geçin.
nvm ile Birlikte Kullanışlı Komut Referansı
Günlük iş akışınızda sıkça başvuracağınız komutları bir arada derleyelim:
nvm install node: En son Node.js sürümünü kurnvm install --lts: En son LTS sürümünü kurnvm use node: En son kurulu sürümü kullannvm current: Aktif sürümü gösternvm ls: Kurulu sürümleri listelenvm ls-remote --lts: İndirilebilir LTS sürümlerini listelenvm alias default 20: Default sürümü ayarlanvm uninstall 14: Belirtilen sürümü kaldırnvm exec 18 node app.js: Sürümü değiştirmeden belirli sürümle komut çalıştırnvm run 16 app.js: Belirli Node.js sürümüyle script çalıştırnvm which 18: Sürümün kurulu olduğu dizini göster
nvm exec komutu özellikle ileride çok işinize yarayacak; sürümü geçici olarak değiştirmeden belirli bir Node.js sürümüyle tek bir komut çalıştırmanızı sağlar:
# Node.js 14 ile sadece bu komutu çalıştır, aktif sürümü değiştirme
nvm exec 14 npm test
# Node.js 18 ile eski uygulamayı başlat
nvm exec 18 node legacy-app.js
Sonuç
nvm, Node.js ekosisteminde çalışan herkesin araç kutusunda bulunması gereken temel bir yardımcıdır. Ubuntu 22.04 üzerinde kurulumu birkaç dakika sürer; getirdiği esneklik ise ölçülemez. Özellikle birden fazla projede çalışan geliştiriciler ve farklı ortamları yönetmesi gereken sysadminler için sürüm kaosuna son vermek adına en pratik çözümdür.
Bu yazıda öğrendiklerimizi özetlersek: nvm kurulumu ve yapılandırması, birden fazla Node.js sürümü kurma ve yönetme, nvm use ile anlık sürüm değiştirme, .nvmrc ile proje bazlı sürüm sabitleme, global paket yönetimi ve CI/CD entegrasyonu konularını ele aldık.
Bir sonraki adım olarak mevcut projelerinize .nvmrc dosyası eklemenizi ve ekibinizin bu dosyayı kullanmasını standart haline getirmenizi tavsiye ederim. Bu küçük adım, “bende çalışıyor ama sende çalışmıyor” sorunlarını büyük ölçüde ortadan kaldıracaktır.
