RubyGems ile Gem Kurulumu ve Yönetimi

Ruby ekosisteminin kalbinde yer alan RubyGems, geliştiricilerin ve sistem yöneticilerinin günlük işlerini kolaylaştıran güçlü bir paket yönetim sistemidir. Eğer Ruby ile çalışıyorsan, gem yönetimini iyi anlamak hem geliştirme ortamını sağlıklı tutmak hem de production sistemlerde sorun yaşamamak açısından kritik önem taşıyor. Bu yazıda RubyGems’i derinlemesine inceleyecek, kurulumdan ileri düzey yönetim senaryolarına kadar her şeyi ele alacağız.

RubyGems Nedir ve Neden Önemlidir?

RubyGems, Ruby programlama dili için standart paket yöneticisidir. Gem adı verilen paketleri indirip kurmanı, versiyonlarını yönetmeni ve bağımlılıkları çözümlemeni sağlar. Ruby 1.9 sürümünden itibaren Ruby kurulumunun içine dahil edilmiştir, yani ayrıca kurman gerekmez.

Sistem yöneticisi perspektifinden bakıldığında RubyGems birkaç önemli bileşenden oluşur:

  • gem komutu: Komut satırı arayüzü, tüm işlemlerin merkezi
  • Gemspec dosyası: Her gem’in metadata bilgilerini içeren yapılandırma dosyası
  • RubyGems.org: Merkezi gem deposu, 150.000’den fazla gem barındırır
  • Gem dizinleri: Kurulu gem’lerin fiziksel olarak depolandığı konumlar

Günümüzde Rails uygulamaları, DevOps araçları (Chef, Puppet, Capistrano), test framework’leri ve daha pek çok kritik araç gem formatında dağıtılmaktadır.

Kurulum Öncesi Hazırlık

RubyGems’i kullanmaya başlamadan önce sisteminizde Ruby’nin kurulu olduğunu doğrulamalısınız.

ruby --version
gem --version
which gem

Eğer gem komutu bulunamazsa ya da çok eski bir versiyondaysa güncelleme yapmanız gerekir. RubyGems’i güncellemek oldukça basittir:

gem update --system
gem update --system 3.4.0  # Belirli bir versiyona güncellemek için

Önemli bir uyarı: Production sistemlerde --system bayrağını kullanmadan önce test ortamında doğrulama yapın. RubyGems güncellemeleri bazen mevcut gem’lerle uyumsuzluk yaratabilir.

Sisteminizde birden fazla Ruby versiyonu varsa (ki genellikle önerilen budur) rbenv veya rvm gibi bir versiyon yöneticisi kullanıyor olmalısınız. Bu araçların her biri kendi gem ortamlarını izole eder, bu da karışıklığı önler.

rbenv version          # Aktif Ruby versiyonunu gösterir
rbenv versions         # Kurulu tüm versiyonları listeler
rbenv which gem        # Hangi gem binary'sinin kullanıldığını gösterir

Temel Gem Kurulum İşlemleri

Tek Gem Kurulumu

En basit haliyle bir gem kurmak şu şekilde yapılır:

gem install rails
gem install rails -v 7.1.0          # Belirli versiyon
gem install rails -v '~> 7.0'       # Yaklaşık versiyon (7.0.x)
gem install rails -v '>= 6.0, < 8'  # Versiyon aralığı

Versiyon kısıtlama operatörleri başlangıçta kafa karıştırıcı gelebilir ama çok işe yararlar:

  • ~> 7.0: 7.0 ve üzeri, 8.0’dan küçük (optimistik operatör)
  • >= 6.0: 6.0 ve daha yüksek
  • = 7.1.0: Tam olarak bu versiyon
  • != 7.0.1: Bu versiyon hariç her şey

Kurulum Seçenekleri

Gem kurulurken documentation oluşturma işlemi özellikle yavaş bağlantılarda veya çok sayıda gem kurulumunda ciddi zaman kaybettirabilir. Bu yüzden özellikle CI/CD pipeline’larında belgeleri atlayabilirsiniz:

gem install nokogiri --no-document
gem install bundler sinatra puma --no-document  # Birden fazla gem aynı anda

Global olarak dokümantasyon oluşturmayı kapatmak için ~/.gemrc dosyasını düzenleyebilirsiniz:

echo "gem: --no-document" >> ~/.gemrc
cat ~/.gemrc

Bu ayardan sonra her kurulumda --no-document yazmanıza gerek kalmaz.

Kurulu Gem’leri Listeleme ve Sorgulamak

Sistemde neler kurulu, hangi versiyonlar mevcut, bunları takip etmek sysadmin’in temel görevlerinden biridir.

gem list                          # Tüm kurulu gem'leri listele
gem list rails                    # Belirli bir gem'i ara
gem list --local                  # Sadece lokal gem'leri göster
gem list --remote rails           # RubyGems.org'da ara
gem list --remote --all rails     # Tüm remote versiyonları göster
gem info nokogiri                 # Detaylı gem bilgisi

Kurulu bir gem’in tam olarak nerede durduğunu bulmak bazen gereklidir, özellikle konfigürasyon dosyalarına erişmek istediğinizde:

gem contents rails           # Gem içindeki tüm dosyaları listele
gem environment              # RubyGems ortam bilgilerini göster
gem environment gemdir       # Gem'lerin kurulu olduğu ana dizin
gem environment gempath      # Tüm gem arama yolları

gem environment komutu gerçekten değerli bilgiler verir. Buradan gem’lerin nereye kurulduğunu, hangi Ruby versiyonunun kullanıldığını ve sistem konfigürasyonunu öğrenebilirsiniz.

Gem Güncelleme ve Silme

Güncellemeler

gem update                    # Tüm gem'leri güncelle
gem update rails              # Sadece belirli bir gem'i güncelle
gem update rails nokogiri     # Birden fazla gem
gem outdated                  # Güncel olmayan gem'leri listele

Dikkat: gem update komutu en son versiyona günceller ve bu her zaman istediğiniz şey olmayabilir. Production sistemlerde belirli bir versiyona güncellemek daha güvenlidir:

gem update rails -v 7.1.2

Eski Versiyonları Temizleme

Zaman içinde sistemde birden fazla gem versiyonu birikerek disk alanı tüketir. gem cleanup komutu eski versiyonları temizler:

gem cleanup                   # Tüm gem'lerin eski versiyonlarını sil
gem cleanup rails             # Sadece rails'in eski versiyonlarını sil
gem cleanup --dry-run         # Ne silineceğini göster ama silme

--dry-run bayrağı gerçek sistemlerde her zaman önce çalıştırmanız gereken altın bir kuraldır.

Gem Silme

gem uninstall rails                    # Rails'i kaldır (hangi versiyonu sorulur)
gem uninstall rails -v 7.0.0           # Belirli versiyonu kaldır
gem uninstall rails --all              # Tüm versiyonları kaldır
gem uninstall rails -x                 # Executable'ları da kaldır
gem uninstall rails --force            # Bağımlılık kontrolü yapmadan zorla kaldır

--force bayrağını dikkatli kullanın. Başka gem’lerin bağımlı olduğu bir gem’i kaldırmak beklenmedik hatalara yol açabilir.

Bundler ile Proje Bazlı Gem Yönetimi

Sistem yöneticileri için en kritik konulardan biri, farklı projelerin farklı gem versiyonlarına ihtiyaç duyması sorunudur. Rails 6 kullanan bir uygulama ile Rails 7 kullanan başka bir uygulama aynı sunucuda çalışabilir. İşte burada Bundler devreye girer.

Bundler, proje bazlı bağımlılık yönetimi yapar ve bir projenin ihtiyaç duyduğu gem’lerin doğru versiyonlarının kurulu olmasını garanti eder.

gem install bundler           # Bundler'ı kur
bundler --version

Gemfile Oluşturma ve Kullanma

Bir proje dizininde Gemfile oluşturduktan sonra:

# Gemfile içindeki tüm gem'leri kur
bundle install

# Gemfile'ı güncelleyip bağımlılıkları çöz
bundle update

# Sadece belirli bir gem'i güncelle
bundle update rails

# Kurulu gem'leri listele
bundle list

# Gem'in tam path'ini göster
bundle show nokogiri

# Uygulamayı bundle context'inde çalıştır
bundle exec rails server
bundle exec rspec
bundle exec rake db:migrate

bundle exec kullanımı kritik önem taşır. Bu sayede projenin Gemfile.lock dosyasında belirtilen tam versiyonlar kullanılır, sistem gem’leri değil. CI/CD pipeline’larınızda ve production deployment script’lerinizde her zaman bundle exec kullanın.

Gemfile.lock Dosyası

Gemfile.lock dosyası tüm bağımlılıkların çözümlenmiş halini saklar. Bu dosyayı versiyon kontrolüne eklemeniz gerekir çünkü takım arkadaşlarınızın ve production sunucunuzun aynı gem versiyonlarını kullanmasını garantiler.

# Gemfile.lock'u güncellemeden sadece kur
bundle install --frozen

# Lock dosyasını yeniden oluştur
bundle lock --update

# Hangi gem'in neden bağımlı olduğunu göster
bundle viz              # Graphviz gerektirir

Private Gem Sunucusu Kurulumu

Şirket içi gem’leri barındırmak veya private gem’leri dağıtmak için kendi gem sunucunuzu kurabilirsiniz. Bu özellikle kurumsal ortamlarda, internet erişimi kısıtlı sistemlerde veya ticari kod barındırırken gereklidir.

Geminabox ile Basit Gem Sunucusu

gem install geminabox
mkdir /var/lib/gems-server
geminabox-server --port 9292 --data /var/lib/gems-server

Sistemd servisi olarak çalıştırmak için /etc/systemd/system/geminabox.service dosyası oluşturun ve servisi aktifleştirin. Ardından gem’lerinizi bu sunucuya yükleyebilirsiniz:

gem inabox my-private-gem-1.0.0.gem --host http://gems.company.internal:9292

Gemfury veya Nexus Entegrasyonu

Kurumsal ortamlarda genellikle Nexus Repository Manager veya Gemfury gibi çözümler tercih edilir. Bunları kullanmak için ~/.gemrc veya proje Gemfile‘ınıza ek kaynak tanımlamanız yeterlidir:

gem sources --add https://gems.company.internal/
gem sources --remove https://rubygems.org/
gem sources --list

Gem Oluşturma: Kendi Gem’inizi Yazın

Tekrarlayan işleri otomatize eden, birden fazla projede kullandığınız utility fonksiyonlarını gem olarak paketlemek çok mantıklıdır. Temel yapıyı hızlıca oluşturmak için:

bundle gem my_utility_gem
cd my_utility_gem
ls -la

Bu komut standart gem yapısını otomatik oluşturur. my_utility_gem.gemspec dosyasını düzenleyerek metadata bilgilerini doldurun, kodunuzu lib/ dizinine ekleyin, ardından:

# Gem'i build et
gem build my_utility_gem.gemspec

# Lokal olarak test et
gem install ./my_utility_gem-0.1.0.gem

# RubyGems.org'a publish et
gem push my_utility_gem-0.1.0.gem

# Private sunucuya push et
gem inabox my_utility_gem-0.1.0.gem --host http://gems.company.internal

Güvenlik ve Audit

Production sistemlerde gem güvenliği ihmal edilmemesi gereken bir konudur. Bilinen güvenlik açıkları olan gem’leri tespit etmek için:

gem install bundler-audit
bundle audit check --update    # Vulnerability veritabanını güncelleyip kontrol et
bundle audit check             # Sadece kontrol et

bundler-audit bilinen CVE’lere karşı Gemfile.lock’unuzu tarar ve raporlar. CI/CD pipeline’ınıza bu adımı eklemek, güvenlik açıklı gem’lerin production’a geçmesini engeller.

Ayrıca gem imzalarını doğrulamak da iyi bir pratiktir:

gem install rails -P HighSecurity   # Yüksek güvenlik politikası
gem install rails -P MediumSecurity # Orta güvenlik politikası
gem cert --list                      # Güvenilen sertifikaları listele

Gerçek Dünya Senaryosu: Rails Uygulaması Production Deployment

Birleştirelim ve tipik bir Rails uygulaması deployment sürecine bakalım:

# Deployment öncesi hazırlık (sunucuda)
ruby --version
gem --version

# Bundler'ı kur (yoksa)
gem install bundler --no-document

# Uygulama dizinine git
cd /var/www/myapp

# Production ortamı için gem'leri kur
# development ve test group'larını hariç tut, deployment dizinini belirt
bundle config set --local without 'development test'
bundle config set --local deployment true
bundle install --jobs 4 --retry 3

# Kurulumu doğrula
bundle check
bundle list | grep rails

# Uygulama testleri
bundle exec rake test

# Servisi yeniden başlat
sudo systemctl restart puma

--jobs 4 parametresi paralel kurulum yapar, özellikle C extension gerektiren gem’lerde (nokogiri, pg, mysql2 gibi) büyük hız kazancı sağlar. --retry 3 ise geçici ağ hatalarında yeniden deneme yapar.

Sorun Giderme

Gem kurulumunda karşılaşılan en yaygın sorunlar ve çözümleri:

Native extension hataları: Çoğunlukla eksik sistem kütüphanelerinden kaynaklanır.

# Nokogiri için örnek
sudo apt-get install libxml2-dev libxslt1-dev  # Debian/Ubuntu
sudo yum install libxml2-devel libxslt-devel   # RHEL/CentOS

# Sistem kütüphanelerini kullanarak kur
gem install nokogiri -- --use-system-libraries

Permission hataları: Sistem Ruby kullanırken sık karşılaşılır.

# Hata: You don't have write permissions for /usr/lib/ruby/gems/
# Çözüm 1: sudo kullan (önerilmez)
sudo gem install rails

# Çözüm 2: Kullanıcı dizinine kur (daha iyi)
gem install rails --user-install
echo 'export PATH="$HOME/.gem/ruby/3.2.0/bin:$PATH"' >> ~/.bashrc

# Çözüm 3: rbenv/rvm kullan (en iyi)
rbenv install 3.2.0
rbenv global 3.2.0
gem install rails  # Artık sudo gerekmez

SSL/TLS hataları: Eski sistemlerde sertifika sorunları yaşanabilir.

gem sources --add http://rubygems.org/  # Geçici çözüm, güvenli değil
# Kalıcı çözüm için SSL sertifikalarını güncelle

Performans İpuçları

Büyük projelerde gem kurulum süresini optimize etmek için:

# Paralel kurulum (CPU sayısına göre ayarla)
bundle install --jobs $(nproc)

# Cache kullanımı
bundle package           # Gem'leri vendor/cache'e indir
bundle install --local   # Sadece cache'den kur, internet yok

# Mirror kullanımı (ağ yavaşsa)
bundle config mirror.https://rubygems.org https://rubygems-mirror.example.com

Docker veya container ortamlarında vendor/cache dizinini cache layer olarak kullanmak build sürelerini dramatik şekilde kısaltır.

Sonuç

RubyGems ve Bundler, Ruby ekosisteminin temel taşlarıdır ve bir sistem yöneticisi olarak bu araçlara hakim olmak zorundasınız. Gem kurulumu basit görünse de doğru versiyonları yönetmek, güvenlik açıklarını takip etmek, production deployment’larını sağlıklı yapmak ve izole ortamlar oluşturmak ciddi bir bilgi ve disiplin gerektirir.

Özellikle şu noktaları aklınızda tutun: Production’da her zaman bundle exec kullanın, Gemfile.lock‘u versiyon kontrolüne dahil edin, bundler-audit‘i CI/CD pipeline’ınıza entegre edin ve mümkünse rbenv veya rvm ile versiyon yönetimi yapın. Sistem Ruby’sine doğrudan gem kurmaktan kaçının, bu uzun vadede yönetim kabusuna dönüşür.

Bu temelleri oturdurduktan sonra Ruby ekosistemindeki araçları çok daha verimli kullanabilir, deployment sorunlarını hızla çözebilir ve güvenli bir gem yönetim stratejisi oluşturabilirsiniz.

Bir yanıt yazın

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