2013-11-25 13 views
5

Nella mia vasta collezione di script Ruby, faccio iniziare i miei script con la faccenda comune:la baracca per più versioni

#!/usr/bin/env ruby 

Ora mi sto trovando alcuni script che hanno bisogno certa versione di Ruby, e no, sono Nessuna app per Rails che può essere distribuita sotto una specifica versione di Ruby. Sono solo script di file singoli che possono essere lanciati dalla riga di comando e non funzionano con la versione di sistema.

C'è un modo per scrivere uno shebang che imposta l'ambiente con rbenv/rvm prima di eseguire il seguente codice del file?

+0

come fai a sapere quale rubino è necessario per ogni script? Sembra che tu abbia un problema di ricerca o un problema di organizzazione dei file da risolvere qui. –

risposta

1

Non è necessario impostare alcun ambiente. Tutto ciò di cui hai bisogno è il percorso verso il binario rubino che vuoi eseguire e tutto il resto seguirà.

Ecco un esempio di come si può impostare in su:

  1. Creare una cartella ~/bin. Ciò manterrà dei puntatori (collegamenti simbolici) a tutti i tuoi binari ruby ​​personali.

  2. Aggiorna la shell PATH in modo che ~/bin sia incluso nel percorso di ricerca per i file eseguibili.

  3. Collegare in modo sintetico qualsiasi binario rubino necessario nel numero ~/bin all'effettivo codice rubino.

Per esempio nel mio ~/bin ho:

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

Ora diciamo che dispone di uno script che ha bisogno di 1.9 per funzionare. Poi tutto quello che dovete fare è:

#!/usr/bin/env ruby19 

Ciò funzionerà se è stato installato il vostro gemme nella directory predefinita per ogni gemma eseguibile rubino. Se hai installato gems da qualche altra parte, diventa più complicato e dovresti modificare GEM_PATH prima di eseguire lo script.

Se non si desidera ottenere fantasia con ~/bin poi basta codificare la linea shebang, invece di puntare direttamente al binario ruby:

#!/opt/ruby19/bin/ruby 

... o il percorso rbenv/rvm equivalente.

La presenza di collegamenti simbolici nello ~/bin consente tuttavia di aggiornare più facilmente i puntatori del bin se si suppone di compilare una nuova patch di Ruby 1.9 e di collocarla in un'altra cartella come /opt/ruby19-p123. Quindi è sufficiente aggiornare il collegamento simbolico in ~/bin e tutti gli script eseguiranno la nuova versione con patch.

1

rbenv cercherà il file .ruby-version fissato dal (per esempio)

$ rbenv local 1.9.3-p448 

Creare un file semplice, check

#!/usr/bin/env ruby 
puts RUBY_VERSION 

Renderlo eseguibile

$ chmod +x check 

Run it

$ ./check 

uscita

1.9.3 

Ciò detto, questo non è un ambiente per file. Se c'è un modo per alterare il comportamento di rbenv usando lo shebang, probabilmente sarebbe meglio adattarsi.

+0

Sì, ma ho convenuto che la tua risposta finora è "1/2" della soluzione. L'altra metà sta scrivendo un launcher che usa questo, o meglio il percorso verso il ruby, per poi lanciare lo script di destinazione con il rubino appropriato –

+0

CD nella directory può consentire una chiamata nativa a 'ruby' per prelevare il'. rbenv-version' file. –

+0

.ruby-version (non .rbenv-version) non ha nulla a che fare con la directory di lavoro, si basa sulla directory in cui si trova lo script. Se si associa ogni script a una versione .ruby, allora si sarà bene. Altrimenti probabilmente dovresti avere collegamenti a specifiche versioni di ruby ​​come suggerito da Casper. Non puoi fare molto altro ed essere portabile perché a shebang non è garantito l'uso di più di una opzione (http://stackoverflow.com/questions/4303128/how-to-use-multiple-arguments-with-a-shebang- ie) –

Problemi correlati