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
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.
Pingback:rbenv bene, ma poi? – T-zone