Bundler en RVM
Bundler 1.0 RC 1 is vers van de pers. Bundler is de dependency manager voor Ruby. Hier bij Finalist hebben we alle projecten die we actief in beheer hebben al omgezet naar Bundler.
Ik zal even laten zien wat Bundler zoal voor je doet. En als we toch bezig zijn, heb ik het ook even over de Ruby Version Manager. Samen vormen deze de ideale combinatie voor beheersbaar houden van de dependencies voor Ruby projecten.
Dependency resolution met Bundler
Een trend in de Ruby community is dat gems steeds kleiner worden. Er wordt veel nadruk gelegd op modulariteit. Een applicatie schrijven is als bouwen met lego: je gebruikt heel veel kleine blokjes.
Daarnaast kunnen er van gems meerdere versies tegelijkertijd op je systeem staan. En als versie 1 van een bepaalde gem geladen is, krijg je een error op het moment dat je versie 2 probeert te laden. Als dat gebeurt doordat het een dependency is van een andere gem, dan is het helemaal lastig om op te lossen.
Dit betekent echter dat er meer en meer dependencies krijgen. Dat vraagt om een kick-ass dependency management tool. En dat is Bundler! Bundler zoekt van te voren uit welke combinatie van versies de juiste is en zorgt ervoor dat alleen die versies geladen worden.
Dependencies definiëren
Met een eenvoudige DSL kunnen dependencies gedefinieerd worden voor je project. Dit doe je in een bestand genaamd “Gemfile“. Je kan per omgeving (productie, test, develepment) aangeven welke dependencies er zijn, welke versie vereist is en waar ze vandaan komen.
Een uitgekleed voorbeeld:
source 'http://rubygems.org' gem 'rails', '3.0.0.rc' gem 'hoptoad_notifier' gem 'mysql' gem 'haml' gem 'formtastic', :git => 'git://github.com/justinfrench/formtastic.git', :branch => 'rails3' gem 'memcache-client' group :development, :test do gem 'rspec-rails', '2.0.0.beta.19' end group :production do gem 'unicorn' end
De standaard bron is natuurlijk rubygems.org, maar gems kunnen ook direct uit github gehaald worden. Voor je applicatie is het dan net alsof deze gem een officiële release is, maar stiekem kan je op edge draaien of je eigen fork er op nahouden.
Dependencies installeren
Draai het commando “bundle” en je hebt alles in huis. De enige voorwaarde is dat je bundler zelf al geïnstalleerd hebt.
Dependencies vastzetten
Zodra je de dependencies geïnstalleerd hebt, wordt er automatisch een Gemfile.lock bestand gegenereerd. Hierin staat beschreven welke versies er gebruikt zijn. Zorg ervoor dat je dit bestand in je source control zet, en je zorgt ervoor dat elke server of development machine dezelfde versies van alle gems draaien.
Dependencies meeleveren
Klaar om je applicatie op te leveren? Draai “bundle package” en de gems worden in je applicatie gezet. En nog steeds is het enige commando om te zorgen dat je alle dependencies hebt “bundle“.
Dependencies vergeten
Dat gaat niet meer. Bundler maakt de load path van je applicatie “stuk”, zodat je alleen maar de juiste gems kan laden. Je applicatie leeft in een eigen bubbel. Er is geen boze buitenwereld die roet in het eten kan gooien.
Gebruiken in je applicatie
In Rails 3 hoef je er niks voor te doen, daar wordt bundler standaard gebruikt. Bij elke andere applicatie heb je al je dependencies in een paar regels code geladen.
require "rubygems" require "bundler" Bundler.setup
Ruby Version Manager
Er zijn een hoop verschillende versies van Ruby. Natuurlijk zijn er verschillende versies van de standaard implementatie, geschreven in C (MRI: Matz’ Ruby Interpretation), maar ook een variant die draait op de Java Virtual Machine (JRuby), eentje voor op de .Net virtual machine (IronRuby), een Ruby geschreven in Ruby (Rubinius) en zo nog een aantal varianten.
Verschillende projecten gebruiken verschillende Ruby versies. Switchen tussen deze versies kan erg vervelend zijn. Gelukkig is er RVM, de Ruby Version Manager. RVM regelt het allemaal voor je! In een enkel commando installeer je elke versie die je maar wilt op elke machine die je maar wilt. RVM ondersteunt meer dan 30 verschillende Ruby versies!
Wil je Ruby Enterprise Edition gebruiken? Simpel:
rvm install ree
Wil je de edge versie van Ruby 1.9.2 draaien?
rvm install 1.9.2-head
RVM checkt de nieuwste versie uit en compileert het voor je.
Elk project zijn eigen Ruby versie
Vervolgens kan je per project aangeven wat de gewenste versie van Ruby is voor dit project. Zodra je een project opent, wordt je environment automatisch voor je ingesteld. Dit doe je in een bestand genaamd “.rvmrc“, wat je ook in je source control zet, zodat andere mensen ook automatisch de juiste Ruby versie voor dit project gebruiken.
Gemsets
RVM doet meer dan alleen versies van Ruby beheren. Het mechanisme om verschillende Ruby versies onafhankelijk van elkaar te draaien wordt ook gebruikt voor het creëren van virtuele omgevingen van beschikbare gems. Deze virtuele omgevingen heten “gemsets”.
Ook al draaien de projecten dezelfde Ruby versie; ze draaien dus, zelfs zonder Bundler, in hun eigen privé omgeving. Volledig geïsoleerd, zoals het hoort.
Gestroomlijnde workflow
Door Bundler en RVM is de workflow om Ruby projecten aan de praat te krijgen nu erg fijn en compact:
- Met Git clone je de repository
- Je gaat naar de verse directory toe
- De juiste Ruby versie en gemset worden voor je geïnstalleerd
- Je installeert bundler voor deze gemset
- Je draait “bundle“
- Alles staat klaar!
Awesome!

[...] This post was mentioned on Twitter by Jeroen Knoops and Marcel, Finalist IT Group. Finalist IT Group said: new blogpost: Bundler en RVM door @iain_nl http://bit.ly/cdzTOK #ruby [...]
Tweets that mention Bundler en RVM | Finalist Developers Blog -- Topsy.com July 27, 2010 9:57
[...] This post was mentioned on Twitter by Iain, ariekanarie. ariekanarie said: Op het Finalist blog legt @iain_nl uit waarom Bundler en RVM heersen: http://bit.ly/cGuypV [...]
Tweets that mention Bundler en RVM | Finalist Developers Blog -- Topsy.com July 27, 2010 10:05
Zie ik die Ruby tag nou steeds groter worden?
Leuke post. Ik word zelf ook heel erg blij van Bundler + RVM. Nooit meer dat gedoe met MacPorts o.i.d. (of beter… ik had gewoon Ubuntu moeten blijven gebruiken…)
altovista July 29, 2010 8:51
op de mac gebruik ik homebrew ipv macports: veel beter! maar apt blijft de beste natuurlijk
Iain Hecker July 29, 2010 11:42
[...] 3 komt met de nieuwe dependency manager Bundler, waar ik vorige keer al over schreef. Daarbij is er in Rails 3 ook een plugin API waardoor het extra makkelijk is voor plugins om in te [...]
Ruby on Rails 3: Een voorbeschouwing | Finalist Developers Blog August 16, 2010 12:05