Episode ini membedah ekosistem package Ruby: gem search dan gem install, struktur gemspec, pembuatan gem dengan bundle gem, Gemfile dan bundle install, Gemfile.lock dengan checksum, source multi-gem, serta kelompok dependency development dan production.

Tidak ada aplikasi modern yang dibangun dari nol tanpa library. Ruby menyediakan ekosistem package yang matang: RubyGems untuk mendistribusikan library, dan Bundler untuk mengelola dependency antar project secara reproduktif. Memahami keduanya adalah prasyarat bekerja di tim atau membuka project open-source.
Episode 12 ini membedah seluruh alur: mencari dan menginstall gem, membaca dan menulis gemspec, membuat gem sendiri dengan bundle gem, lalu mengelola dependency project melalui Gemfile, bundle install, dan Gemfile.lock yang kini menyertakan checksum. Di akhir, kalian akan paham bagaimana gem yang kalian pakai di episode 0 sampai 11 sampai ke mesin kalian.
RubyGems adalah package manager resmi Ruby. Sumber utamanya adalah rubygems.org. Alur kerjanya dimulai dari pencarian, lalu instalasi:
gem search sinatra
gem install sinatra
gem list sinatragem search sinatra mencari gem dengan kata kunci sinatra di rubygems.org. gem install sinatra menginstall versi terbaru beserta dependency-nya. gem list sinatra menampilkan gem yang terinstall di sistem. Instalasi global tanpa Bundler sebaiknya dihindari untuk project nyata — itu sebabnya kita butuh Bundler.
Setiap gem didefinisikan oleh file gemspec yang berisi metadata: nama, versi, ringkasan, penulis, dan aturan packaging. Gemspec adalah kode Ruby yang memanggil Gem::Specification.new:
Gem::Specification.new do |spec|
spec.name = "perkenalan_ruby"
spec.version = "0.1.0"
spec.summary = "Gem contoh untuk belajar"
spec.authors = ["Arman Dwi Pangestu"]
spec.required_ruby_version = ">= 3.4"
spec.files = Dir["lib/**/*.rb"]
endGemspec menentukan versi Ruby minimum (spec.required_ruby_version), daftar file yang dikemas (spec.files), dan dependency runtime via spec.add_dependency. Semua gem yang kalian install adalah manifest serupa yang dibangun menjadi file .gem lalu di-publish ke rubygems.org.
Bundler menyediakan generator untuk membuat struktur gem baru lengkap dengan gemspec, folder lib, dan konfigurasi CI:
bundle gem perkenalan_ruby
cd perkenalan_ruby
gem build perkenalan_ruby.gemspec
ls *.gembundle gem perkenalan_ruby membuat folder project gem dengan semua scaffolding standar. gem build perkenalan_ruby.gemspec mengompilasi gemspec menjadi file .gem yang bisa diinstall di mana saja. Gem yang dibuat dengan cara ini sudah siap di-publish ke rubygems.org.
Kode utama gem diletakkan di lib. Bundler menciptakan file lib/perkenalan_ruby.rb sebagai entry point yang mengekspos class atau module publik. Setiap file di bawah lib ikut terpaket karena daftar spec.files di gemspec. Untuk menguji saat pengembangan, gunakan bin/console yang sudah disediakan generator — ia membuka sesi IRB dengan gem sudah di-load.
Gemfile mendeklarasikan dependency project. Bundler akan menyelesaikan versi yang saling kompatibel, dan Grup memisahkan dependency berdasarkan lingkungan:
source "https://rubygems.org"
gem "sinatra", "~> 4.0"
gem "puma", "~> 6.4"
group :development, :test do
gem "rspec"
gem "rubocop", require: false
endBaris source "https://rubygems.org" menetapkan sumber gem. Constraint "~> 4.0" mengizinkan update minor tapi menahan major. Group :development, :test memuat rspec dan rubocop hanya di lingkungan development dan test, tidak di production. Ini menjaga footprint produksi tetap ramping.
Setelah mendefinisikan Gemfile, jalankan install untuk mengunci seluruh dependency:
bundle install
bundle exec ruby main.rb
bundle listbundle install menyelesaikan dependency dan menulis Gemfile.lock — manifest yang membekukan versi persis setiap gem. Sejak RubyGems 4.0, Gemfile.lock menyertakan checksum setiap gem sehingga manipulasi artefak bisa terdeteksi. bundle exec ruby main.rb menjalankan perintah dalam konteks gem yang terkunci, dan bundle list menampilkan daftarnya.
Kadang sebuah gem hanya tersedia dari source internal (misalnya GitHub atau registry privat). Bundler mendukung banyak source; cukup deklarasikan gem dari source yang tepat:
source "https://rubygems.org"
gem "sinatra", "~> 4.0"
gem "gem_internal", source: "https://gem.internal.example.com"gem "gem_internal", source: "https://gem.internal.example.com" menarik gem tersebut dari source khusus sementara sisanya dari rubygems.org. Perhatikan: source spesifik per gem ditulis sebagai argumen hash, berbeda dengan blok source global.
Tip
Selalu commit Gemfile.lock untuk aplikasi (bukan library). Lockfile memastikan setiap developer dan server CI menjalankan dependency yang persis sama, dan kini dilindungi checksum untuk integritas.
Episode 12 menghubungkan kalian dengan ekosistem distribusi Ruby: mencari dan menginstall gem dengan RubyGems, struktur gemspec, pembuatan gem dengan bundle gem, serta pengelolaan dependency melalui Gemfile, bundle install, Gemfile.lock ber-checksum, source multi-gem, dan grup environment.
Inti yang harus dibawa pulang:
gem search dan gem install mengelola gem secara global; Bundler mengelola per project.bundle gem membuat struktur gem siap publish dalam satu perintah.Gemfile mendeklarasikan dependency; grup memisahkan lingkungan development dan production.bundle exec menjalankan perintah dalam konteks lockfile.Gemfile.lock kini menyertakan checksum untuk integritas dependency.Di episode 13 selanjutnya kita akan membahas networking dan HTTP — socket TCP dengan Happy Eyeballs v2 (RFC 8305) yang menjadi default sejak Ruby 3.4, UDP socket, dasar socket server, serta HTTP client dengan Net::HTTP, URI, dan gem modern seperti httparty dan faraday. Keterampilan komunikasi antar service yang wajib dikuasai developer backend.