2013-11-25 18 views
5

In meiner großen Sammlung von Ruby-Skripte, kann ich meine Skripte mit dem Gemeinsamen shebang starten:shebang für mehrere Versionen

#!/usr/bin/env ruby 

Jetzt bin ich einige Skripte zu finden, die bestimmte Ruby-Version tun müssen, und nein, sie sind Keine Rails-Apps, die unter einer bestimmten Ruby-Version bereitgestellt werden können. Sie sind nur einzelne Dateiskripte, die über die Befehlszeile gestartet werden können und nicht mit der Systemversion funktionieren.

Gibt es eine Möglichkeit, einen Shebang zu schreiben, der die Umgebung mit rbenv/rvm einstellt, bevor der folgende Code der Datei ausgeführt wird?

+0

woher wissen Sie, welcher Rubin für jedes Skript benötigt wird? Es scheint, dass entweder ein Nachschlageproblem oder ein Dateiorganisationsproblem hier zu lösen ist. –

Antwort

1

Sie müssen nicht unbedingt eine Umgebung einrichten. Alles, was Sie brauchen, ist der Pfad zu der Ruby-Binärdatei, die Sie ausführen möchten, und alles andere wird folgen.

Hier ist ein Beispiel dafür, wie man es einrichten könnte:

  1. ~/bin einen Ordner erstellen. Dies wird Zeiger (Symlinks) zu all Ihren persönlichen Ruby-Binärdateien enthalten.

  2. Aktualisieren Sie Ihre Shell PATH, so dass ~/bin im Suchpfad für ausführbare Dateien enthalten ist.

  3. Verknüpfen Sie alle Ruby-Binärdateien, die Sie benötigen, in Ihrem ~/bin mit dem eigentlichen Rubin-Binärcode.

Zum Beispiel in meinem ~/bin ich habe:

ruby18 -> /opt/ruby18/bin/ruby 
ruby19 -> /opt/ruby19/bin/ruby 
ruby20 -> /opt/ruby20/bin/ruby 

Lassen Sie uns jetzt sagen, Sie ein Skript, das 1.9 ausgeführt werden muss. Dann alles, was Sie tun müssen, ist:

#!/usr/bin/env ruby19 

Das funktioniert, wenn Sie Ihre Edelsteine ​​in das Standard-Juwel Verzeichnis für jeden Rubin ausführbaren installiert haben. Wenn Sie Edelsteine ​​irgendwo anders installiert haben, wird es komplizierter und Sie müssen GEM_PATH ändern, bevor Sie Ihr Skript ausführen.

#!/opt/ruby19/bin/ruby 

... oder das Äquivalent rbenv/rvm Pfad: direkt an den Rubin binär Punkt

Wenn Sie nicht wollen, mit ~/bin Lust bekommen dann nur statt Ihre shebang Linie hart codieren.

Mit Symlinks in Ihrem ~/bin obwohl ermöglicht es Ihnen leichter zu Ihrem bin Zeiger zu aktualisieren, wenn der Sie einen neuen Patch von Rubin sagen wir mal kompilieren 1,9, und Sie wollen es wie /opt/ruby19-p123 in einem anderen Ordner zu platzieren. Dann müssen Sie nur den Symlink in ~/bin aktualisieren und alle Ihre Skripte werden die neue gepatchte Version ausführen.

1

rbenv sucht nach der .ruby-version-Datei festgelegt durch (zum Beispiel)

$ rbenv local 1.9.3-p448 

Erstellen Sie eine einfache Datei, check

#!/usr/bin/env ruby 
puts RUBY_VERSION 

ausführbar machen

$ chmod +x check 

Run es

$ ./check 

Ausgabe

1.9.3 

Das heißt, ist dies nicht eine pro-Datei-Einstellung. Wenn es eine Möglichkeit gibt, Rbenvs Verhalten mit dem Shebang zu ändern, wäre das wahrscheinlich eine bessere Lösung.

+0

Ja, aber ich bin damit einverstanden, dass Ihre Antwort bisher '1/2' der Lösung ist. Die andere Hälfte schreibt einen Launcher, der diesen oder besser den Pfad zum Rubin verwendet, um dann das Zielskript mit dem entsprechenden Ruby –

+0

CD'ing in das Verzeichnis zu starten, um einen nativen Aufruf von 'ruby' zu ermöglichen, den' 'aufzunehmen. Rbenv-Version' Datei. –

+0

.ruby-Version (nicht .rbenv-Version) hat nichts mit Ihrem Arbeitsverzeichnis zu tun, es basiert auf dem Verzeichnis, in dem sich das Skript befindet. Wenn Sie jedes Skript mit einer .ruby-Version kombinieren, dann werden Sie es sein fein. Andernfalls müssen Sie wahrscheinlich Links zu bestimmten Versionen von Ruby haben, wie von Casper vorgeschlagen. Du kannst nicht viel mehr tun und tragbar sein, weil es nicht garantiert ist, dass Shebang mehr als eine Option braucht (http://stackoverflow.com/questions/4303128/how-to-use-multiple-arguments-with-a-shebang- ie) –

Verwandte Themen