{"id":231,"date":"2016-09-23T12:40:40","date_gmt":"2016-09-23T10:40:40","guid":{"rendered":"http:\/\/www.tenzione.it\/?p=231"},"modified":"2016-09-23T12:47:23","modified_gmt":"2016-09-23T10:47:23","slug":"il-modo-migliore-per-installare-e-usare-ruby","status":"publish","type":"post","link":"https:\/\/www.tenzione.it\/?p=231","title":{"rendered":"Il modo migliore per installare (e usare) ruby"},"content":{"rendered":"<p>Capita a tutti, specie se siete pi\u00f9 sistemisti, devops, o similare che programmatori, di chiedervi, quale sia il miglior tool\/sistema\/programma per fare determinate cose. Ed \u00e8 sicuramente capitato negli anni, di aver annusato, usato, cipollato con ruby.<\/p>\n<p>Ruby infatti \u00e8 un ottimo linguaggio sia per cose &#8220;serie&#8221; sia per piccoli script (come lo \u00e8 il perl, python, ecc&#8230;).<\/p>\n<p>C&#8217;\u00e8 un solo &#8220;problema&#8221; con ruby: lo sviluppo, quando \u00e8 iniziato ad essere usato seriamente dal mondo, \u00e8 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\u00f2 problematiche. O outdated, o fanno &#8220;a noci&#8221; (volgare per &#8220;litigano&#8221;) tra sistemi di pacchettizzazione ufficiale e del linguaggio. Questa cosa \u00e8 vera anche per python e in parte anche per perl.<\/p>\n<p>I programmatori risolvono (si fa per dire) la cosa con repository terze parti che hanno versioni cutting-edge ma per me non \u00e8 una soluzione mantenibile (nemmeno per loro ma i programmatori hanno una visione del sistema statico: quello che mi serve oggi \u00e8 l&#8217;ultima versione poi deve rimanere tutto fermo). In ruby hanno in parte risolto la cosa con RVM ma \u00e8 una soluzione che non mi piace perch\u00e8 troppo invasiva (si, una soluzione che modifica il comportamento di un comando come &#8220;cd&#8221; la considero invasiva).<\/p>\n<p>E allora? E allora, ecco con dopo questa &#8220;lieve&#8221; introduzione vi presento la miglior soluzione, a mio giudizio, per avere le versioni di ruby che volete e un sistema in ordine.<\/p>\n<p>La soluzione si chiama\u00a0<strong>RBENV<\/strong>.<\/p>\n<p>La pagina ufficiale \u00e8 qui:\u00a0<a href=\"https:\/\/github.com\/rbenv\/rbenv\">https:\/\/github.com\/rbenv\/rbenv<\/a>\u00a0ma per farla breve ecco come usarlo:<\/p>\n<p>installate rbenv clonando il git:<\/p>\n<pre class=\"line number1 index0 alt2\"><code class=\"plain plain\">git clone https:\/\/github.com\/sstephenson\/rbenv.git ~\/.rbenv<\/code>\r\n\r\n<code class=\"plain plain\">git clone https:\/\/github.com\/sstephenson\/ruby-build.git ~\/.rbenv\/plugins\/ruby-build<\/code><\/pre>\n<p>Il passo successivo \u00e8 informare la nostra shell di questo oggetto mediante i comandi:<\/p>\n<pre class=\"line number1 index0 alt2\"><code class=\"shell functions\">export<\/code> <code class=\"shell plain\">PATH=<\/code><code class=\"shell string\">\"$HOME\/.rbenv\/bin:$PATH\"<\/code>\r\n\r\n<code class=\"shell functions\">eval<\/code> <code class=\"shell string\">\"$(rbenv init -)\"<\/code><\/pre>\n<p>Ovviamente vogliamo rendere &#8220;definitiva&#8221; la cosa, per tanto, aggiungiamo lo stesso codice in coda al nostro .profile (o quello che usate .zshrc, .bash_profile&#8230;):<\/p>\n<pre class=\"line number1 index0 alt2\"><code class=\"shell functions\">echo 'export<\/code> <code class=\"shell plain\">PATH=<\/code><code class=\"shell string\">\"$HOME\/.rbenv\/bin:$PATH\"' &gt;&gt; .profile<\/code>\r\n\r\n<code class=\"shell functions\">echo 'eval<\/code> <code class=\"shell string\">\"$(rbenv init -)\"' &gt;&gt; .profile<\/code><\/pre>\n<div class=\"line number2 index1 alt1\">A questo punto ci si apre il mondo delle &#8220;cose che si possono fare con rbenv&#8221;. Per prima cosa la lista delle versioni installabili:<\/div>\n<div class=\"line number2 index1 alt1\"><\/div>\n<pre class=\"line number2 index1 alt1\">rbenv install -l<\/pre>\n<p>La lista \u00e8 lunga, ma in pratica possiamo installare qualunque versione vogliamo di ruby, che verr\u00e0 scaricata e compilata nella nostra directory .rebenv\/versions\/ Ad esempio, voglio installare l&#8217;ultima versione utile della 2.0.0 che in questo momento \u00e8\u00a02.0.0-p648:<\/p>\n<pre>mizio@thaumiel:~$ ruby --version\r\nruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]\r\nmizio@thaumiel:~$ rbenv install 2.0.0-p648 \r\nDownloading ruby-2.0.0-p648.tar.bz2...\r\n-&gt; https:\/\/cache.ruby-lang.org\/pub\/ruby\/2.0\/ruby-2.0.0-p648.tar.bz2\r\nInstalling ruby-2.0.0-p648...\r\n\r\nWARNING: ruby-2.0.0-p648 is past its end of life and is now unsupported.\r\nIt no longer receives bug fixes or critical security updates.\r\n\r\nInstalled ruby-2.0.0-p648 to \/home\/mizio\/.rbenv\/versions\/2.0.0-p648\r\n\r\nmizio@thaumiel:~$ rbenv rehash \r\nmizio@thaumiel:~$ rbenv global 2.0.0-p648 \r\nmizio@thaumiel:~$ ruby --version\r\nruby 2.0.0p648 (2015-12-16 revision 53162) [x86_64-linux]<\/pre>\n<p>Ovvero in pratica, usate &#8220;rbenv install VERSIONE&#8221; per una specifica versione, &#8220;rbenv rehash&#8221; dopo ogni installazione, e &#8220;rebenv global VERSIONE&#8221; per usare quella specifica versione. Infatti:<\/p>\n<pre>mizio@thaumiel:~$ rbenv versions\r\n system\r\n* 2.0.0-p648 (set by \/home\/mizio\/.rbenv\/version)\r\nmizio@thaumiel:~$ rbenv version\r\n2.0.0-p648 (set by \/home\/mizio\/.rbenv\/version)\r\nmizio@thaumiel:~$ rbenv global \r\n2.0.0-p648<\/pre>\n<p>Ovviamente la cosa \u00e8 dinamica e posso passare da una versione all&#8217;altra:<\/p>\n<pre>mizio@thaumiel:~$ rbenv global system \r\nmizio@thaumiel:~$ rbenv version\r\nsystem (set by \/home\/mizio\/.rbenv\/version)\r\nmizio@thaumiel:~$ ruby --version\r\nruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]\r\nmizio@thaumiel:~$ rbenv global 2.0.0-p648 \r\nmizio@thaumiel:~$ ruby --version\r\nruby 2.0.0p648 (2015-12-16 revision 53162) [x86_64-linux]<\/pre>\n<p>Poich\u00e8 funziona cos\u00ec, 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 &#8220;locale&#8221;. ie:<\/p>\n<pre>mizio@thaumiel:~$ rbenv version\r\n2.0.0-p648 (set by \/home\/mizio\/.rbenv\/version)\r\nmizio@thaumiel:~$ gem env home\r\n\/home\/mizio\/.rbenv\/versions\/2.0.0-p648\/lib\/ruby\/gems\/2.0.0\r\nmizio@thaumiel:~$ gem install bundler\r\nFetching: bundler-1.13.1.gem (100%)\r\nSuccessfully installed bundler-1.13.1\r\nParsing documentation for bundler-1.13.1\r\nInstalling ri documentation for bundler-1.13.1\r\n1 gem installed<\/pre>\n<p>Infine potete rimuovere tutto con l&#8217;apposito &#8220;rbenv uninstall VERSIONE&#8221; (e quindi le gem installate):<\/p>\n<pre>mizio@thaumiel:~$ rbenv uninstall 2.0.0-p648 \r\nrbenv: remove \/home\/mizio\/.rbenv\/versions\/2.0.0-p648? y\r\nmizio@thaumiel:~$ ls -l \/home\/mizio\/.rbenv\/versions\/\r\ntotal 0\r\nmizio@thaumiel:~$ rbenv rehash\r\nmizio@thaumiel:~$ rbenv global system\r\nmizio@thaumiel:~$ rbenv version\r\nsystem (set by \/home\/mizio\/.rbenv\/version)\r\nmizio@thaumiel:~$ ruby --version\r\nruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]<\/pre>\n<p>Ci sono ancora un p\u00f2 di comandi utili come &#8220;rbenv which&#8221;, &#8220;rbenv whence&#8221; ecc., ma potete trovare tutto alla pagina di rbenv e\/o nella documentazione.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Capita a tutti, specie se siete pi\u00f9 sistemisti, devops, o similare che programmatori, di chiedervi, quale sia il miglior tool\/sistema\/programma per fare determinate cose. Ed \u00e8 sicuramente capitato negli anni, di aver annusato, usato, cipollato con ruby. Ruby infatti \u00e8 un ottimo linguaggio sia per cose &#8220;serie&#8221; sia per piccoli script (come lo \u00e8 il [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":234,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19,11],"tags":[25,131,129,22],"class_list":["post-231","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-te-ne-parlo","category-tubuntu","tag-programmazione","tag-rbenv","tag-ruby","tag-ubuntu"],"_links":{"self":[{"href":"https:\/\/www.tenzione.it\/index.php?rest_route=\/wp\/v2\/posts\/231","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tenzione.it\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tenzione.it\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tenzione.it\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tenzione.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=231"}],"version-history":[{"count":5,"href":"https:\/\/www.tenzione.it\/index.php?rest_route=\/wp\/v2\/posts\/231\/revisions"}],"predecessor-version":[{"id":237,"href":"https:\/\/www.tenzione.it\/index.php?rest_route=\/wp\/v2\/posts\/231\/revisions\/237"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.tenzione.it\/index.php?rest_route=\/wp\/v2\/media\/234"}],"wp:attachment":[{"href":"https:\/\/www.tenzione.it\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=231"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tenzione.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=231"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tenzione.it\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=231"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}