Il modo migliore per installare (e usare) ruby

Capita a tutti, specie se siete più sistemisti, devops, o similare che programmatori, di chiedervi, quale sia il miglior tool/sistema/programma per fare determinate cose. Ed è sicuramente capitato negli anni, di aver annusato, usato, cipollato con ruby.

Ruby infatti è un ottimo linguaggio sia per cose “serie” sia per piccoli script (come lo è il perl, python, ecc…).

C’è un solo “problema” con ruby: lo sviluppo, quando è iniziato ad essere usato seriamente dal mondo, è partito per la tangente, e si sono seguite tante versioni e oggi come oggi le versioni stock fornite con le distribuzioni sono sempre un pò problematiche. O outdated, o fanno “a noci” (volgare per “litigano”) tra sistemi di pacchettizzazione ufficiale e del linguaggio. Questa cosa è vera anche per python e in parte anche per perl.

I programmatori risolvono (si fa per dire) la cosa con repository terze parti che hanno versioni cutting-edge ma per me non è una soluzione mantenibile (nemmeno per loro ma i programmatori hanno una visione del sistema statico: quello che mi serve oggi è l’ultima versione poi deve rimanere tutto fermo). In ruby hanno in parte risolto la cosa con RVM ma è una soluzione che non mi piace perchè troppo invasiva (si, una soluzione che modifica il comportamento di un comando come “cd” la considero invasiva).

E allora? E allora, ecco con dopo questa “lieve” introduzione vi presento la miglior soluzione, a mio giudizio, per avere le versioni di ruby che volete e un sistema in ordine.

La soluzione si chiama RBENV.

La pagina ufficiale è qui: https://github.com/rbenv/rbenv ma per farla breve ecco come usarlo:

installate rbenv clonando il git:

git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

Il passo successivo è informare la nostra shell di questo oggetto mediante i comandi:

export PATH="$HOME/.rbenv/bin:$PATH"

eval "$(rbenv init -)"

Ovviamente vogliamo rendere “definitiva” la cosa, per tanto, aggiungiamo lo stesso codice in coda al nostro .profile (o quello che usate .zshrc, .bash_profile…):

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> .profile

echo 'eval "$(rbenv init -)"' >> .profile
A questo punto ci si apre il mondo delle “cose che si possono fare con rbenv”. Per prima cosa la lista delle versioni installabili:
rbenv install -l

La lista è lunga, ma in pratica possiamo installare qualunque versione vogliamo di ruby, che verrà scaricata e compilata nella nostra directory .rebenv/versions/ Ad esempio, voglio installare l’ultima versione utile della 2.0.0 che in questo momento è 2.0.0-p648:

mizio@thaumiel:~$ ruby --version
ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]
mizio@thaumiel:~$ rbenv install 2.0.0-p648 
Downloading ruby-2.0.0-p648.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p648.tar.bz2
Installing ruby-2.0.0-p648...

WARNING: ruby-2.0.0-p648 is past its end of life and is now unsupported.
It no longer receives bug fixes or critical security updates.

Installed ruby-2.0.0-p648 to /home/mizio/.rbenv/versions/2.0.0-p648

mizio@thaumiel:~$ rbenv rehash 
mizio@thaumiel:~$ rbenv global 2.0.0-p648 
mizio@thaumiel:~$ ruby --version
ruby 2.0.0p648 (2015-12-16 revision 53162) [x86_64-linux]

Ovvero in pratica, usate “rbenv install VERSIONE” per una specifica versione, “rbenv rehash” dopo ogni installazione, e “rebenv global VERSIONE” per usare quella specifica versione. Infatti:

mizio@thaumiel:~$ rbenv versions
 system
* 2.0.0-p648 (set by /home/mizio/.rbenv/version)
mizio@thaumiel:~$ rbenv version
2.0.0-p648 (set by /home/mizio/.rbenv/version)
mizio@thaumiel:~$ rbenv global 
2.0.0-p648

Ovviamente la cosa è dinamica e posso passare da una versione all’altra:

mizio@thaumiel:~$ rbenv global system 
mizio@thaumiel:~$ rbenv version
system (set by /home/mizio/.rbenv/version)
mizio@thaumiel:~$ ruby --version
ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]
mizio@thaumiel:~$ rbenv global 2.0.0-p648 
mizio@thaumiel:~$ ruby --version
ruby 2.0.0p648 (2015-12-16 revision 53162) [x86_64-linux]

Poichè funziona così, ogni versione ha il suo ambito gem (il cpan di ruby per chi parla perlese) che diventa quindi autonomo. Possiamo installare le gem del nostro ambiente senza super utente essendo “locale”. ie:

mizio@thaumiel:~$ rbenv version
2.0.0-p648 (set by /home/mizio/.rbenv/version)
mizio@thaumiel:~$ gem env home
/home/mizio/.rbenv/versions/2.0.0-p648/lib/ruby/gems/2.0.0
mizio@thaumiel:~$ gem install bundler
Fetching: bundler-1.13.1.gem (100%)
Successfully installed bundler-1.13.1
Parsing documentation for bundler-1.13.1
Installing ri documentation for bundler-1.13.1
1 gem installed

Infine potete rimuovere tutto con l’apposito “rbenv uninstall VERSIONE” (e quindi le gem installate):

mizio@thaumiel:~$ rbenv uninstall 2.0.0-p648 
rbenv: remove /home/mizio/.rbenv/versions/2.0.0-p648? y
mizio@thaumiel:~$ ls -l /home/mizio/.rbenv/versions/
total 0
mizio@thaumiel:~$ rbenv rehash
mizio@thaumiel:~$ rbenv global system
mizio@thaumiel:~$ rbenv version
system (set by /home/mizio/.rbenv/version)
mizio@thaumiel:~$ ruby --version
ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]

Ci sono ancora un pò di comandi utili come “rbenv which”, “rbenv whence” ecc., ma potete trovare tutto alla pagina di rbenv e/o nella documentazione.

 

Leave a Reply

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *