2015-05-11 8 views
13

Ich möchte die neueste stabile Version von Ruby mit rbenv installieren. Dieses Feature won't be happening in Rbenv selbst.Installation der letzten stabilen Version von Ruby mit rbenv

Wenn ich den Befehl rbenv install -l in meiner Shell ausführen, erhalte ich eine lange Liste der verfügbaren Versionen. Die Liste enthält alle Arten von Einträgen. Die folgende ist eine unvollständige Liste das Format und die Vielfalt zu demonstrieren:

$ rbenv install -l 
Available versions: 
    2.0.0-p643 
    2.0.0-p645 
    2.1.0-dev 
    2.1.0-preview1 
    2.1.0-preview2 
    2.1.0-rc1 
    2.1.4 
    2.1.5 
    2.1.6 
    2.2.0-dev 
    2.2.0-preview1 
    2.2.0-preview2 
    2.2.0-rc1 
    2.2.0 
    2.2.1 
    2.2.2 
    2.3.0-dev 
    jruby-1.7.19 
    jruby-1.7.20 
    jruby-9.0.0.0-dev 
    jruby-9.0.0.0+graal-dev 
    jruby-9.0.0.0.pre1 
    jruby-9.0.0.0.pre2 
    maglev-1.0.0 
    maglev-1.1.0-dev 
    maglev-2.0.0-dev 
    mruby-dev 
    mruby-1.0.0 
    mruby-1.1.0 
    rbx-2.5.2 
    rbx-2.5.3 
    ree-1.8.7-2011.12 
    ree-1.8.7-2012.01 
    ree-1.8.7-2012.02 
    topaz-dev 

Mein Ziel ist es, den Befehl rbenv install VERSION in einem Shell-Skript zu automatisieren, wo VERSION ist die höchste x.x.x Release. Mit anderen Worten, ich muss automatisch den höchsten Eintrag in der Liste ersetzen, der mit einer Nummer beginnt und nicht mit -something in VERSION endet. Aus dieser Liste brauche ich 2.2.2.

Was kann ich in mein Shell-Skript eingeben, um automatisch die höchste x.x.x Version im Befehl rbenv install x.x.x auszuwählen?

Bearbeiten: Da Ruby noch nicht installiert ist, muss die Lösung in Bash und nicht Ruby sein.

Edit 2: Ich möchte die MRI (Mainstream) Version von Ruby.

+1

Es scheint mir, Sie wollen nur die letzte in der Liste, die mit einer Nummer beginnt (da Sie anscheinend MRI wollen) und nicht 'pre', 'dev' oder' rC# 'in seinem Namen). So etwas würde funktionieren: 'lines.reverse_each.find {| version | version = ~/^ \ d/&& version! ~/pre | dev | rc \ d /} ' –

+1

(Ich kann nicht garantieren, dass das immer funktioniert, aber vielleicht hilft es Ihnen, damit anzufangen. Wenn Sie neugierig sind Wie Ruby-Build die Liste sortiert, können Sie es hier sehen: https://github.com/sstephenson/ruby-build/blob/master/bin/ruby-build#L1012) –

+0

Dank @Jordan für die Kommentare. Ich brauche das Ergebnis in Bash, da Ruby noch nicht installiert ist. Der Sortieralgorithmus ist großartig zu wissen, danke für das Aufzeigen. –

Antwort

5
rbenv install -l | awk -F '.' ' 
    /^[[:space:]]*[0-9]+\.[0-9]+\.[0-9]+[[:space:]]*$/ { 
     if (($1 * 100 + $2) * 100 + $3 > Max) { 
     Max = ($1 * 100 + $2) * 100 + $3 
     Version=$0 
     } 
     } 
    END { print Version }' 
  • Nehmen Sie die größte Version (Reihenfolge sortiert oder nicht)

Wenn Liste eine einfachere sed (Posix-Version) sortiert ist genug ist

rbenv install -l | sed -n '/^[[:space:]]*[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}[[:space:]]*$/ h;${g;p;}' 
+0

Das ist die Magie, die ich wollte. Antwort angenommen. Vielen Dank! –

+2

Nur ein Hinweis für jeden, der Debian benutzt (zumindest für Debian 8 Jessie) - die Standardversion von awk unterstützt '[[:: space:]]' aus irgendeinem Grund nicht. Ersetzen Sie es einfach mit '[\ t]', um das gleiche Ergebnis zu erhalten. –

1

Nach ziemlich viel Versuch und Irrtum fand ich einen Weg, um die neueste stabile Version von dieser Liste zu greifen. Dies ist nicht perfekt, da es nur das richtige Muster und die letzte Version davon aufnimmt, aber es sollte den Job erledigen. Es wird funktionieren, solange die Versionen in Ordnung sind.

wird diese 2.2.2

rbenv install -l | grep -P "^ [[:digit:]]\.[[:digit:]]\.[[:digit:]]$" | tail -1 

produzieren wir dieses Ergebnis in rbenv install wie diese verstopfen:

rbenv install $(rbenv install -l | grep -P "^ [[:digit:]]\.[[:digit:]]\.[[:digit:]]$" | tail -1) 
+0

Das wird nicht die neueste stabile Version bekommen, wenn die letzte stabile Version eine Patch-Nummer hat (z.B. '2.0.0-p645'), oder? Sie möchten definitiv den neuesten Patch-Level, da sie oft Sicherheitsupdates enthalten. –

+0

@Jordan Ruby verwendet keine Patch-Nummern mehr. Bitte sehen Sie https://www.ruby-lang.org/en/news/2013/12/21/ruby-version-policy-changes-with-2-1-0/ Die neueste stabile und gepatchte Version wird vertreten sein von der neuesten Teeny-Version, die genau das ist, was dieser Code bestimmt. –

+0

Ah. Das macht es dann ein bisschen einfacher. –

-2

Ich würde es in Ruby viel lieber tun, als in bash.

versions = `rbenv install -l` 
versions.split("\s").select{|v| v.match(/^\d*\.\d*\.\d*$/)}.last 
+1

Ich auch :) Aber Ruby ist noch nicht installiert;) +1 für die Ruby-Lösung aber :) –

+0

Ich glaube, es ist möglich, eine ausführbare Datei mit Rubinius zu kompilieren: http://rubini.us/2011/03/17/running -ruby-with-no-ruby/ –

+0

Ich schaute in die Rubinius-Lösung. Es produziert nur Rubinius-Byte-Code von dem, was ich sagen kann. Also brauche ich immer noch ihre virtuelle Maschine oder was auch immer, um den Code auszuführen. Es ist kein kompilierter Maschinencode und ich würde zuerst Rubinius installieren müssen, um das zu tun. –

20

Einfache Lösung :

rbenv install -l | grep -v - | tail -1 

Filtert alle Versionen aus, die einen Bindestrich - enthalten. Dies sind alle Nicht-MRT-Versionen und MRI-Vorabversionen. Wählt dann die letzte aus, die garantiert die höchste ist, da die Ruby-Build-Ausgabe bereits nach der Versionsnummer aufsteigend sortiert ist.

+0

Vielleicht ist es besser, es in Bash als in Ruby zu tun ... –

+1

Netter Ansatz. Ich habe nicht bemerkt, dass die MRI-Versionen die einzigen ohne Bindestriche sind. –

+1

Als ich versuchte, dies einer Shell-Variablen zuzuordnen, hatte der Wert einige führende Leerzeichen, die einen Fehler verursachten. Das hat das Problem gelöst: LATEST_RUBY_VERSION = "$ (rbenv install -l | grep -v - | schwanz -1 | tr -d '[[: space:]]')" – peflorencio

0

Mine ist Anonymous Antwort ähnlich (aber kürzer, weil ich \ d verwende).

rbenv install -l| grep -P "\s2.*(\.|\d)\d$" | tail -1 

Ich wollte die neueste jruby angeben, weshalb ich eine „2“ verwendet, so kann ich die 2 mit „jruby“ ersetzen:

rbenv install -l| grep -P "\sjruby.*(\.|\d)\d$"|tail -1 

Sie jruby mit anderen Saiten ersetzen können um verschiedene Arten von Rubin zu erhalten, z rbx, mruby.

Verwandte Themen