Ruby installieren

Sie finden im Folgenden eine Beschreibung der Installation von Ruby auf der Linux-Distribution Debian 6 „Squeeze“ (z.Zt. als „stable“ deklariert), soweit sinnvoll aus den offiziellen Paketen.


Ruby-Interpreter

Kleiner Exkurs: Wie für viele andere Programmiersprachen gibt es auch für Ruby verschiedene Interpreter. Der urspüngliche und bekannteste ist MRI (Matz's Ruby Interpreter, nach dem Ruby-Erfinder Yukihiro „Matz“ Matsumoto) bzw. YARV (Yet Another Ruby VM, integriert seit Version 1.9).

Andere Interpreter sind: jRuby (implementiert in Java), Rubinius (rbx, implementiert in Ruby selbst), MacRuby (implementiert in Objective-C, benutzt LLVM), MagLev (in der GemStone/S-VM von VMware), Ruby Enterprise Edition (ree, nur für 1.8, EOL), IronRuby etc.

Die Situation auf Debian

Auf Debian 6 „Squeeze“ ist das Standard-Ruby noch Ruby 1.8 (das Paket ruby hängt ab von ruby1.8), obwohl es Ruby 1.9.0 seit Ende 2007 gibt und Ruby 1.9.1 seit Anfang 2009. Ruby 1.9 ist auf Debian ebenfalls verfügbar (ruby1.9.1 bzw. ruby1.9.1-full), allerdings heißt das Binary dann nicht „ruby“ sondern „ruby1.9.1“. Lassen Sie sich nicht verwirren vom Namen des Pakets; dieses heißt zwar ruby1.9.1, beinhaltet aber ein Ruby in Version 1.9.2. Der Name des Pakets wurde nicht geändert da die Version ABI-kompatibel ist zu Ruby 1.9.1.

Als Einsteiger ist oft nicht klar welche der Ruby-Libraries wie z.B. rails man als Pakete auf Debian verwenden soll und welche nicht. Ich möchte hier nicht über die Unstimmigkeiten zwischen der Ruby-Community und der Debian-Paketierungs-Denkweise philosophieren, sondern einen pragmatischen Weg beschreiben. Zwar bin ich ein Freund von Paketen, aber meist will man eine Applikation ja nicht nur auf genau einem System und einer Distribution betreiben können sondern auf verschiedenen Systemen. (Ein Großteil der Entwickler von Ruby-Applikationen arbeitet auf Mac OS X und deployt auf Linux-Server.) Welche Pakete eine bestimmte Linux-Distribution mitbringt ist also erstmal nur eingeschränkt relevant.

Aus eigener Erfahrung: Das Zusammenspiel zwischen den diversen Ruby-Paketen auf Debian funktioniert nicht immer reibungslos, und einiges muß dann anders gemacht werden als mit einem Upstream-Ruby. Das ist gerade für Einsteiger nicht optimal. Der pragmatische Weg ist also im wesentlichen nur Ruby aus Debian zu nehmen und sonst nichts.

Welche Version?

Ruby (cRuby) verwendet seit Version 1.9 die YARV-VM die wesentlich schneller ist als der 1.8-Interpreter. Ruby 1.9 bietet außerdem eine sehr gute eingebaute Unicode-Unterstützung. (Kurz gesagt: jeder String hat eine Kodierung (Encoding), welche für Binär-Strings auch ASCII-8BIT (a.k.a. BINARY) sein kann. Üblicherweise verwendet man aber UTF-8 und muß sich dann keine weiteren Gedanken machen.) Die Vorteile von 1.9 gegenüber 1.8 sind also größer als es die Änderung der Minor-Versionsnummer vermuten läßt. Für neue Projekte sollte immer mindestens die Version 1.9 eingesetzt werden.

Auche hier aber wieder pragmatisch gedacht: Wenn Sie ein Projekt installieren wollen das Ruby verwendet und mit Ruby 1.8 läuft, dann können Sie einfach das Paket ruby installieren, und brauchen hier nicht weiterzulesen.

Paketverwaltung

Die Standard-Paketverwaltung für Ruby ist RubyGems (auf der Shell: gem) bzw. für Applikationen Bundler (auf der Shell: bundle). Man fährt am leichtesten wenn man diesen Weg benutzt, dann hat man auf allen Systemen die gleichen Pakete.

Vergleich

Um den Einstieg zu erleichtern möchte ich an dieser Stelle ein paar Entsprechungen in anderen Programmiersprachen nennen damit man sich schneller zurechtfindet.

Ruby Python Perl
Interaktive Shell irb python / bpython ~ perl -d
Paket Gem Egg ~ Module
Paket-Repository RubyGems PyPI CPAN
Paket installieren gem install … easy_install … /
pip install …
perl -MCPAN 'install …'
/ cpan …
Virtuelle Umgebung Bundler (+ gem) VirtualEnv (+ SetupTools)
Befehl in virt. Umgebung bundle exec … (. bin/activate && …)
Meta-Datei (Applikationen) Gemfile setup.py /
requirements.txt
Meta-Datei (Bibliotheken) .gemspec [*] setup.py / PKG-INFO META.yml / META.json
Abhängigkeiten installieren bundle install ./setup.py develop
Web-Server-Interface Rack WSGI PSGI

Installation

Es gibt verschiedene Möglichkeiten Ruby auf Debian zu installieren. Neben dem manuellen Kompilieren aus den Sourcen ist eine davon via RVM (Ruby Version Manager), womit sich auf einem System gleichzeitig verschiedene Ruby-Interpreter in jeweils verschiedenen Versionen verwenden lassen. RVM eignet sich z.B. für Maschinen auf denen entwickelt wird und wo man sein Projekt in verschiedenen Ruby-Versionen testen möchte, oder wenn man einen anderen Ruby-Interpreter verwenden will.

Die Variante per RVM soll hier allerdings nicht weiter besprochen werden. Hier geht es um den Fall daß die Distribution (hier Debian 6 „Squeeze“) bereits Ruby 1.9 als Paket mitbringt, was wir uns zunutze machen.

Die folgenden Befehle müssen als Benutzer „root“ ausgeführt werden.

Wie üblich empfiehlt sich aptitude statt apt-get („aptitude is now the preferred text front end for APT“) und erstmal ein Aktualisieren der Paketlisten:

apt-get install aptitude
aptitude update

Dann installieren wir Ruby:

aptitude install ruby1.9.1 ruby1.9.1-dev make irb1.9.1 rdoc1.9.1

(Stattdessen könnten wir auch ruby1.9.1-full installieren, allerdings hat dies eine harte Abhängigkeit auf ruby1.9.1-examples und schlägt die Tcl/Tk-Erweiterung libtcltk-ruby1.9.1 vor – beides benötigt nicht jeder.)

Die oben installierten Header-Dateien aus ruby1.9.1-dev – und damit auch der gcc-Compiler und make – sind erforderlich um manche „native“ – also zu kompilierende – Gems installieren zu können. Auf einem Ziel-System auf dem nur fertige Debian-Pakete installiert werden könnten wir dies auch weglassen wenn wir vorher eventuelle Abhängigkeiten (also Gems) schon als Pakete gebaut haben.

Installation: „Alternatives“-System

Wir haben nun auf der Shell ruby1.9.1 verfügbar. Allerdings steht in ausführbaren Ruby-Skripten üblicherweise der Shebang

#! /usr/bin/env ruby

d.h. wir brauchen noch einen Symlink. Dies machen wir mit einem längeren Befehl, dafür aber sauber, über das „Alternatives“-System von Debian:

abi="1.9.1"
update-alternatives \
  --install "/usr/bin/ruby"                         "ruby" \
            "/usr/bin/ruby${abi}" 400 \
  --slave   "/usr/bin/irb"                          "irb" \
            "/usr/bin/irb${abi}" \
  --slave   "/usr/bin/rake"                         "rake" \
            "/usr/bin/rake${abi}" \
  --slave   "/usr/bin/gem"                          "gem" \
            "/usr/bin/gem${abi}" \
  --slave   "/usr/bin/rdoc"                         "rdoc" \
            "/usr/bin/rdoc${abi}" \
  --slave   "/usr/share/man/man1/ruby.1.gz"         "ruby.1.gz" \
            "/usr/share/man/man1/ruby${abi}.1.gz" \
  --slave   "/usr/share/man/man1/irb.1.gz"          "irb.1.gz" \
            "/usr/share/man/man1/irb${abi}.1.gz" \
  --slave   "/usr/share/man/man1/rake.1.gz"         "rake.1.gz" \
            "/usr/share/man/man1/rake${abi}.1.gz" \
  --slave   "/usr/share/man/man1/gem.1.gz"          "gem.1.gz" \
            "/usr/share/man/man1/gem${abi}.1.gz" \
  --slave   "/usr/share/man/man1/rdoc.1.gz"         "rdoc.1.gz" \
            "/usr/share/man/man1/rdoc${abi}.1.gz"
# => … using /usr/bin/ruby1.9.1 to provide /usr/bin/ruby (ruby) in auto mode.
update-alternatives --auto "ruby"

Jetzt haben wir auf der Shell den Interpreter ruby, die interaktive Shell irb, das Ruby-Make rake, den Paket-Manager gem, das Hilfe-Werkzeug rdoc, sowie die jeweiligen man pages verfügbar, ganz wie man es erwarten würde:

which ruby    # => /usr/bin/ruby
ruby -v       # => ruby 1.9.2p0 (2010-08-18 revision 29036) [i486-linux]

Installation: RubyGems

Da wir ja nicht das RubyGems von Debian sondern das offizielle verwenden wollen, damit sich auch dieses so verhält wie man es erwartet, sind noch folgende Befehle auszuführen:

REALLY_GEM_UPDATE_SYSTEM=yes \
  gem update --system
# => Updating RubyGems …
gem install rubygems-update
update_rubygems

Installation: Bundler

Ebenso gehört zu einer sinnvollen Ruby-Installation das Werkzeug Bundler das zur Installation von Abhängigkeiten von Applikationen dient:

gem install bundler
bundle -v             # => Bundler version 1.1.4

Fertig.

Und zur Sicherheit nochmal: Wir installieren keine weiteren Pakete mit Ruby-Bezug von Debian. Wer also z.B. Ruby on Rails benutzen will installiert das nicht etwa per

aptitude install rails

sondern per

gem install rails

Sicherheitshalber kann man die Installation des Pakets ruby1.8 verbieten, damit man sich das nicht später versehentlich mal als Abhängigkeit von irgendwas drüberinstalliert. Dies machen wir per APT pinning“. Eine negative Priorität bedeutet, daß das Paket nicht installiert werden darf:

(
echo ''
echo 'Package: ruby1.8'
echo 'Pin: version *'
echo 'Pin-Priority: -100'
) >> /etc/apt/preferences

Native Gems

Bei der Installation von Gems (per gem install … oder per bundle install, z.B. für eine Applikation wie RedMine) kann es passieren daß das Paket selbst oder ein erforderliches Paket native Erweiterungen (native extensions) enthält, also Teile die kompiliert werden müssen und u.U. von Header-Dateien einer C-Bibliothek auf dem System abhängen. Beispiel: Das Gem sqlite3. Probieren wir das mal aus (zwecks Hilfe zur Selbsthilfe):

gem install sqlite3
# Building native extensions.  This could take a while...
# ERROR:  Error installing sqlite3:
#         ERROR: Failed to build gem native extension.
# 
#         /usr/bin/ruby1.9.1 extconf.rb
# checking for sqlite3.h... no
# sqlite3.h is missing.
# …

Diese Meldung sagt uns daß die SQLite3-Header-Datei sqlite3.h fehlt. Nach der Namenskonvention auf Debian für Bibliotheken (libraries) vermuten wir diese in einem Paket lib{name}-dev. Suchen wir mal danach:

aptitude search libsqlite3 | grep dev
# p   libsqlite3-dev    - SQLite 3 development files
# …

Meist findet man auf diese Weise schon das gesuchte Paket. Ansonsten kann man auch online nach dem Datei-Namen „sqlite3.h“ in allen Debian-Paketen suchen, oder man benutzt dazu das Werkzeug apt-file.

Installieren wir mal das gefundene Paket und probieren dann nochmal das SQLite3-Gem auf unser System zu bekommen:

aptitude install libsqlite3-dev
# …
gem install sqlite3
# Building native extensions.  This could take a while...
# Successfully installed sqlite3-1.3.6

Viel Spaß!



Twitter: @kempgen

Rechtliches | (c) Philipp Kempgen