Auf unseren Servern stellen wir die Programmiersprache Ruby bereit und bieten dir hier sowohl die offiziell zur von uns eingesetzten Linux-Distribution CentOS 5 gehörende Version 1.8.5, die dort als stabil gilt und gepflegt wird, als auch ein von uns selbst kompiliertes Ruby 1.8.7 sowie ein 1.9.2 und ein 1.9.3. Du hast also die freie Wahl, welche Version du benutzen möchtest. Außerdem bieten wir dir die Möglichkeit, innerhalb deines Uberspaces eigene Installationen mittels RVM vorzunehmen.
Die Version 1.8.5 liegt direkt im $PATH und ist unter /usr/bin/ruby erreichbar.
Die Version 1.8.7 liegt standardmäßig nicht im $PATH, sondern ist mit dem Prefix /package/host/localhost/ruby-1.8.7 installiert und liegt dort in bin. Möchtest du in deinem Account gerne das neuere Ruby benutzen, kannst du deine .bash_profile entsprechend erweitern:
[helga@helium ~]$ cat <<'__EOF__' >> ~/.bash_profile
export PATH=/package/host/localhost/ruby-1.8.7/bin:$PATH
export PATH=$HOME/.gem/ruby/1.8/bin:$PATH
__EOF__
Dann noch die geänderte Konfiguration neu einlesen:
[helga@helium ~]$ . ~/.bash_profile
Das war's - damit stehen dir mit ruby, gem etc. automatisch die entsprechenden Varianten der Version 1.8.7 bereit.
Übrigens: Wir haben für die 1.8.7 bereits alle Gems vorinstalliert, die du für den Einsatz von Redmine brauchst, und zwar auch in den passenden Versionen, die jeweils nicht die neuesten sind. Solltest du anderes im Sinn haben, steht es dir natürlich frei, selbst die gewünschten Gems in neueren Versionen zu installieren.
Die Version 1.9.2 liegt standardmäßig nicht im $PATH, sondern ist mit dem Prefix /package/host/localhost/ruby-1.9.2 installiert und liegt dort in bin. Möchtest du in deinem Account gerne das neuere Ruby benutzen, kannst du deine .bash_profile entsprechend erweitern:
[helga@helium ~]$ cat <<'__EOF__' >> ~/.bash_profile
export PATH=/package/host/localhost/ruby-1.9.2/bin:$PATH
export PATH=$HOME/.gem/ruby/1.9.1/bin:$PATH
__EOF__
Dann noch die geänderte Konfiguration neu einlesen:
[helga@helium ~]$ . ~/.bash_profile
Das war's - damit stehen dir mit ruby, gem etc. automatisch die entsprechenden Varianten der Version 1.9.2 bereit. Die häufig benötigten Gems fcgi, mysql und sqlite3 haben wir hier bereits mitinstalliert.
Die Version 1.9.3 liegt standardmäßig nicht im $PATH, sondern ist mit dem Prefix /package/host/localhost/ruby-1.9.3 installiert und liegt dort in bin. Möchtest du in deinem Account gerne das neuere Ruby benutzen, kannst du deine .bash_profile entsprechend erweitern:
[helga@helium ~]$ cat <<'__EOF__' >> ~/.bash_profile
export PATH=/package/host/localhost/ruby-1.9.3/bin:$PATH
export PATH=$HOME/.gem/ruby/1.9.1/bin:$PATH
__EOF__
Dann noch die geänderte Konfiguration neu einlesen:
[helga@helium ~]$ . ~/.bash_profile
Das war's - damit stehen dir mit ruby, gem etc. automatisch die entsprechenden Varianten der Version 1.9.3 bereit. Die häufig benötigten Gems fcgi, mysql und sqlite3 haben wir hier bereits mitinstalliert.
Viele Ruby-Anwender schwören auf RVM, den Ruby Version Manager. Er ermöglicht dir, mehrere Ruby-Installationen in genau den von dir benötigten Versionen innerhalb deines Uberspaces zu installieren, ebenso ermöglicht er dir die einfache Verwaltung von Gems und Gemsets.
In der Vergangenheit hatten wir das Script uberspace-setup-rvm dazu bereitgestellt, das RVM installiert und auch gleich automatisch deine Shell-Konfiguration angepasst hat. Neuere RVM-Versionen bringen allerdings einen Installer mit, der auch letzteres selbst übernimmt - womit unser Script nun obsolet ist. Du kannst also direkt der offiziellen RVM-Installationsdoku folgen, die eigentlich nur aus einem einzigen Befehl bestehen, den du direkt aus ausführen kannst.
[helga@helium ~]$ bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)
Den dann genannten Schritt source ~/.bash_profile können wir weg lassen, weil du dich aufgrund der Änderung deiner Shell im nächsten Schritt ohnehin einmal aus- und wieder einloggen musst. RVM hat nämlich einige Abhängigkeiten, die du dir wie folgt anzeigen lassen kannst:
[helga@helium ~]$ rvm requirements
Zum Zeitpunkt der Erstellung dieser Doku sind fast alle Abhängigkeiten erfüllt, bis auf eine: RVM setzt voraus, dass die bash, die als Shell zum Einsatz kommt, mindestens die Version 4.1 haben muss - unsere Standard-Shell ist aber derzeit noch die bash-Version 3.2. Wir stellen dir allerdings parallel dazu auch eine aktuellere bash bereit, die du mit dem Befehl chsh aktivieren kannst (du wirst dabei einmal nach deinem SSH-Passwort gefragt):
[helga@helium ~]$ chsh -s /package/host/localhost/bash-4/bin/bash
Changing shell for helga.
Password:
Shell changed.
Anschließend musst du dich einmal aus- und wieder einloggen und kannst dann mit RVM loslegen. Eigene Ruby-Interpreter beliebiger Versionen kannst du wie von anderen Systemen gewohnt mit rvm install … installieren; eigene Gems mit gem install … ohne weitere Optionen.
Bitte beachte: Wenn du irgendwelche Scripts schreibst (oder benutzt), die auf RVM setzen, z.B. run-Scripts der daemontools oder von runwhen, oder auch FastCGI-Scripts, so achte bitte darauf, die jeweils einführenden Zeile #!/bin/sh auf #!/package/host/localhost/bash-4/bin/bash anzupassen, damit RVM nicht unter der älteren Default-Shell ausgeführt wird und es hier möglicherweise zu Problemen kommt.
Solltest du anstelle der Standardshell bash die zsh benutzen, beachte bitte, dass RVM nur mit neueren zsh-Versionen kompatibel ist. Wir stellen dir hier entsprechend eine Version bereit, die du mit chsh -s /package/host/localhost/zsh-4.3/bin/zsh für deinen Account anstelle der älteren Default-Version aktivieren kannst. Auf der RVM-Website findest du mehr Infos über die Integration von RVM und zsh.
Die weiteren Punkte dieses Artikels sind nur für dich relevant, wenn du die von uns global bereitgestellten Ruby-Versionen benutzen möchtest. Als RVM-User betreffen sie dich nicht.
Auch RubyGems steht bereit, so dass du dir mittels gem eigene Gems installieren kannst. Damit das funktioniert, musst du gem die Option --user-install mitgeben, weil es ansonsten versucht, die Gems global zu installieren, was du ohne root-Rechte natürlich nicht kannst. Der einfachste Weg, der dir auch am meisten Tipparbeit spart, ist, dir eine .gemrc anzulegen, die dafür sorgt, dass gem immer automatisch die Option --user-install verwendet; außerdem deaktivieren wir hier die Installation von RDoc- und ri-Dokumentation (das kannst du auf Wunsch ggf. auch weglassen):
[helga@helium ~]$ echo "gem: --user-install --no-rdoc --no-ri" > ~/.gemrc
Nochmals der Hinweis: Das brauchst du nur zu machen, wenn du einen unserer global installierten Ruby-Interpreter verwendest. Hast du dir mittels RVM einen eigenen installiert, kannst du die Gems problemlos „global“ installieren, weil „global“ hier dann nur „innerhalb deiner eigenen RVM-Installation“ bedeutet.
Bitte beachte, wenn du CGI- oder FastCGI-Scripts mit Ruby entwickelst: In dieser Umgebung wird ein Standard-$PATH vom Webserver gesetzt, der die von dir vorgenommenen Erweiterungen nicht berücksichtigt. Du hast also zwei Möglichkeiten:
Du kannst entweder in der Shebang-Zeile deines Scripts explizit die gewünschte Version angeben, also z.B. /package/host/localhost/ruby-1.9.2/bin/ruby, oder du kannst dir einen Mini-Wrapper drumherum schreiben, der zunächst deine angepasste Umgebung lädt und dann erst das Script ausführt:
#!/bin/sh
export HOME=/home/helga
. $HOME/.bash_profile
exec ruby real-script.rb
Arbeitest du mit Frameworks wie Ruby on Rails, ist das in der Regel keine Thema: Hier generierst du auf der Shell (die ja die angepasste Umgebung hat) mit Kommandos wie rails new MyProject ganze Gruppen von Scripts, die dann automatisch den festen Pfad zum (neueren) Ruby-Interpreter in die Scripts schreiben.
Bundler ist ein Tool, um Gems und ihre Abhängigkeiten mit Hilfe von Gemfiles zu verwalten. Allerdings versucht ein bundle install standardmäßig, deine eigenen Gems global zu installieren, was natürlich mangels entsprechender Schreibrechte nicht funktionieren kann. Du kannst ihm aber mit Hilfe von --path ~/.gem mitteilen, dass er die Gems stattdessen lokal in deinem Uberspace installieren soll. So geht's:
[helga@helium ~]$ cd MyProjectWithBundler
[helga@helium MyProjectWithBundler]$ bundle install --path ~/.gem
--path ist eine sogenannte remembered option, das heißt, Bundler merkt sie sich in ~/.bundle/config, so dass du bei jeder weiteren Ausführung einfach nur bundle install angeben brauchst.
Einzelne Gems lassen sich ggf. nur mit gewissen Klimmzügen installieren; primär dann, wenn sie Software voraussetzen, die auf unseren Hosts nicht global zur Verfügung steht, oder nicht in den benötigten Versionen, oder nicht an den entsprechenden Stellen. Wir sammeln an dieser Stelle Workarounds, mit denen du Module, deren Installation auf den ersten Blick problematisch ist, trotzdem installiert bekommst.
Viele auf Ruby basierende Applikationen, die Datenbanken benutzen, greifen standardmäßig auf SQLite zurück und verwenden dafür das sqlite3-Gem. Allerdings ist die zu CentOS gehörende SQLite-Version 3.3.6 zu alt, um mit neueren Versionen dieses Gems zu harmonieren. Wir haben dir daher unter /package/host/localhost/sqlite-3 eine neuere Version bereitgestellt und in unseren globalen Ruby-1.8.7- und Ruby-1.9-Installationen das entsprechende Gem für dich schon vorinstalliert. Möchtest du es aber innerhalb deines Uberspaces installieren (beispielsweise, um eine neuere Version des Gems zu verwenden als die, die global vorliegt), musst du gem install mitgeben, wo es die von uns aktualisierte SQLite-Version finden kann. Das funktioniert so:
[helga@helium ~]$ gem install --user-install sqlite3 -- \
--with-sqlite3-include=/package/host/localhost/sqlite-3/include \
--with-sqlite3-lib=/package/host/localhost/sqlite-3/lib
Ähnlich musst du vorgehen, wenn du Bundler verwenden willst - bundle install will nämlich alle benötigen Gems direkt in deinem Uberspace installieren, und zwar auch jene, die bereits global installiert sind (ja, das soll so sein). Insofern will es auch das sqlite3-Gem noch einmal installieren, nur eben jetzt innerhalb deines Uberspaces. Mit Hilfe von bundle config build.sqlite3 kannst du Bundler aber anweisen, beim Installieren des Gems eben jene neuere SQLite-Installation zu verwenden, und zwar so:
[helga@helium MyProjectWithBundler]$ bundle config build.sqlite3 \
--with-sqlite3-include=/package/host/localhost/sqlite-3/include \
--with-sqlite3-lib=/package/host/localhost/sqlite-3/lib
Du brauchst das nur einmal zu machen; Bundler merkt sich diese Einstellung in seiner ~/.bundle/config. Anschließend kann ein bundle install auch das neueste SQLite-Gem problemlos installieren.
Nokogiri benötigt eine neuere libxml2 und eine neuere libxslt als die Versionen, die wir global bereitgestellt haben. Mittels toast kannst du dir aber selbstständig neuere Versionen davon in deinem Uberspace installieren und das Nokogiri-Gem dagegen kompilieren. Und so geht's:
[hilde@argon ~]$ toast arm libxml libxslt
Installierst du Nokogiri selbst via gem, dann bitte so:
[hilde@argon ~]$ gem install --user-install nokogiri -- \
--with-xml2-lib=$HOME/.toast/armed/lib \
--with-xml2-include=$HOME/.toast/armed/include/libxml2 \
--with-xslt-dir=$HOME/.toast/armed
Setzt du eine Applikation ein, die für das Gem-Management auf Bundler setzt, musst du hingegen dessen Konfiguration so anpassen, dass er Nokogiri korrekt für dich baut:
[hilde@argon ~]$ bundle config build.nokogiri \
--with-xml2-lib=$HOME/.toast/armed/lib \
--with-xml2-include=$HOME/.toast/armed/include/libxml2 \
--with-xslt-dir=$HOME/.toast/armed
Danke an rbq für den Hinweis auf den von ihm erdachten Workaround!
linecache19 benötigt zwingend einige Header der verwendeten Ruby-Version, und zwar welche, die nicht im includes-Verzeichnis von Ruby mitinstalliert werden, sondern ausschließlich im Ruby-Source enthalten sind.
Wenn du nun gem install --user-install linecache19 sagst, schaut das Gem, ob es den Ruby-Source irgendwo findet, und wenn nicht, dann lädt es ein komplette Ruby-Source-Paket aus dem Netz (!) und versucht das nicht etwa in einem temporären Verzeichnis zu entpacken, sondern in einem Unterverzeichnis des bestehenden Ruby-Interpreters (!), wo du natürlich keine Schreibrechte hast - das ist ja der zentral von uns bereitgestellte Interpreter.
http://isitruby19.com/linecache19 liefert hierbei letztlich den entscheidenden Hinweis - man kann sich den Ruby-Source auch selbst runterladen und linecache19 dann sagen, wo es den findet. So geht's, am Beispiel von Ruby 1.9.2-p180:
[hilde@argon ~]$ wget http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p180.tar.gz
[hilde@argon ~]$ tar -xzvf ruby-1.9.2-p180.tar.gz
[hilde@argon ~]$ gem install --user-install linecache19 -- \
--with-ruby-include=$HOME/ruby-1.9.2-p180
Wenn du eine andere Ruby-Version verwendest (ruby -v verrät sie dir) musst du natürlich entsprechend jene herunterladen und angeben - das bekommst du schon hin.
Setzt du eine Applikation ein, die für das Gem-Management auf Bundler setzt, musst du hingegen dessen Konfiguration so anpassen, dass er linecache19 korrekt für dich baut:
[hilde@argon ~]$ bundle config build.linecache19 \
--with-ruby-include=$HOME/ruby-1.9.2-p180
Übrigens: Wenn du RVM einsetzt und damit ein eigenes Ruby 1.9 kompiliert hast, hat RVM den Source netterweise vorhanden gelassen. In diesem Fall musst du den Source nicht noch einmal herunterladen, sondern kannst als Pfad statt $HOME/ruby-1.9.2-p180 direkt den Pfad angeben, in dem RVM die Sourcen abgelegt hat - das wäre dann $rvm_path/src/ruby-1.9.2-p180 (auch hier musst du natürlich die Versionsangabe anpassen, wenn du eine andere Ruby-Version verwendest).
RMagick ist ein Modul, das ImageMagick an Ruby anbindet. Es verlangt allerdings eine neuere ImageMagick-Version als die, die bei CentOS 5 enthalten ist. Wir stellen dir daher unter /package/host/localhost/ImageMagick eine aktuellere Version bereit.
Problematisch ist, dass man dem RMagick-Gem leider partout nicht sagen kann, wo es ImageMagick findet - es befragt dazu zwangsweise das
Programm Magick-config, das dazu im $PATH liegen muss. Aber mit einem Kniff geht's - mit diesen drei Zeilen am Ende in deiner ~/.bash_profile:
[hilde@argon ~]$ cat >> ~/.bash_profile <<'__EOF__'
export PATH=/package/host/localhost/ImageMagick/bin:$PATH
export LD_LIBRARY_PATH=/package/host/localhost/ImageMagick/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/package/host/localhost/ImageMagick/lib/pkgconfig:$PKG_CONFIG_PATH
__EOF__
Bitte logge dich anschließend einmal aus und wieder ein, damit diese Variablen in deiner Session entsprechend gesetzt werden. Anschließend lässt sich sich RMagick wie gewohnt mit …
[hilde@argon ~]$ gem install --user-install rmagick
… installieren. Für Bundler sollten hier keine Anpassungen nötig sein, da ja keine weiteren Argument für den gem install ...-Aufruf vonnöten sind, die Bundler mitgeteilt werden müssten, und die via .bash_profile gesetzten Umgebungsvariablen auch für Bundler gelten.
Wenn du dich für Ruby interessierst, interessierst du dich vielleicht auch für das Ruby on Rails-Framework, zu dem wir dir eine eigene Seite bereitgestellt haben.