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ß!