Wer die Skriptsprache Ruby auf Linux-Distributionen verwenden möchte, hat es von vornherein schwer. In vielen Tutorials wird gleich zu Beginn geraten, auf den von der Distribution mitgelieferten Ruby-eigenen Paketmanager Rubygems zu verzichten und stattdessen einen eigenen zu installieren. Damit fangen die Probleme erst an. Noch schwieriger wird es, wenn gerade die Bibliothek, die man verwenden möchte, eine aktuelle Ruby-Version voraussetzt - die offiziellen stabilen Ruby-Versionen sind derzeit 1.9.2 (deren End-of-Life aber bereits angekündigt ist) und 2.1.2, während sich Ubuntu noch bei 1.9.1 und 2.0 bewegen, von Debian mal ganz zu schweigen ...
Die Ruby-Community hat mit dem Ruby Version Manager (RVM) ein recht praktisches Tool entwickelt, mit dem sich diverse Ruby-Interpreter und die zugehörigen Bibliotheken parallel pflegen lassen. Selbst die in Java implementierte Ruby-Version JRuby kann damit installiert und verwaltet werden.
Das Problem dabei ist nur, dass man damit ein Paralleluniversum aufbaut, das dem Paketmanager der Distribution verschlossen bleibt. Will man nun ein Programm installieren, das Ruby voraussetzt, will das Apt-Tool die Skriptsprache installieren, obwohl sie dank RVM ja bereits vorhanden ist. Ein Beispiel dafür ist "vim-gtk", die grafische Version des Vim-Editors, die unbedingt die Pakete "libruby1.9.1", "ruby" und "ruby1.9.1" installiert haben möchte.
Hier hilft das Programm "equivs" weiter, mit dem sich Dummy-Pakete für bereits installierte Software bauen lassen. Das Paket besteht aus zwei Tools: "equivs-control" legt ein Control-File an, wie es auch sonst für den Bau von Debian-Paketen verwendet wird. "equivs-build" stellt dann damit ein Debian-Paket her. Die Befehle "equivs-control ruby1.9.1" und "equivs-control libruby1.9.1" erzeugen die beiden Control-Files, in denen schon die meisten Felder ausgefüllt sind. Es fehlen noch die konkreten für das jeweilige Paket zutreffenden Angaben. Für das Ruby-Paket sind dies:
Package: ruby1.9.1 Version: 1.9.3.484-2ubuntu1 Provides: ruby
Die Provides-Zeile zeigt, wie man mit der später folgenden Installation des Pakets "ruby1.9.1" auch die Abhängigkeit vom "ruby"-Paket miterfüllt. Die im Control-File geforderte genaue Versions-Nummer lässt sich in Erfahrung bringen, indem man mit "apt-get changelog libruby1.9.1" oder "apt-cache show libruby1.9.1" detaillierte Informationen zu einem Paket ausgibt. Für die Libruby sehen die wesentlichen Zeilen des Control-File in etwa so aus:
Package: libruby1.9.1 Version: 1.9.3.484-2ubuntu1 File: postinst #!/bin/sh ln -s /usr/local/rvm/rubies/ruby-1.9.1-p431/lib/libruby.so.1.9.1 /usr/lib/libruby-1.9.1.so.1.9
Interessant ist hier der Abschnitt "File", der ein Postinstall-Skript beinhaltet, das einen symbolischen Link von der RVM-Version der Bibliothek in das Systemverzeichnis der Bibliotheken anlegt - sonst kann der symbolische Linker die Referenz des Vim-Binary nicht auflösen. Im Zweifelsfall hilft hier "ldd /usr/bin/gvim" weiter.
Schließlich bleibt nur noch, die beiden Pakete zu bauen und zu installieren:
equivs-build ruby1.9.1 equivs-build libruby1.9.1 sudo dpkg -i libruby1.9.1_1.9.3.484-2ubuntu1_all.deb sudo dpkg -i ruby1.9.1_1.0_all.deb
Mit "equivs" lassen sich auf diese Weise diverse Probleme mit dem Paketmanager umschiffen. Übertreiben sollte man es mit dieser Methode aber nicht, denn auch das mündet am Ende ins Chaos.