24 janvier 2012

du Ruby sous OSX

Les outils DevOps sont quasiment tous basés sur Ruby, ce langage ayant à la fois la force d'un langage de haut niveau - au moins autant que Java en ayant une syntaxe bien plus compactes - et le potentiel d'un langage proche de l'OS, de nombreux paquets 'gem' nécessitant des extensions système re-compilées à l'installation - essayez de faire un lien symbolique en Java...


Sous Mac OS, comme pour de nombreux autres outils, Ruby est installé par défaut, mais évidemment dans une version un peu ancienne et customisée par Apple. Cela permet de faire immédiatement tourner des outils Ruby mais cela veut aussi dire qu'on risque à un moment ou un autre d'être coincé par une spécificité de la plateforme au barreaux dorés.

J'ai donc voulu installer RVM, qui est un gestionnaire de version de Ruby, permettant accessoirement de rester en mode utilisateur sans accès root. L'installation de RVM en elle même n'est pas un soucis :

bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )

par la suite, on va y installer des versions de ruby et/ou de ses variantes (jRuby par exemple) - et là, ça se complique, d'où ce blog pour vous éviter d'avoir comme moi à éplucher les réponses de Google.

D'abord, il va falloir compiler Ruby lors de l'installation - je vous l'ai dit, Ruby est fortement lié à l'OS et se recompile lors de l'installation, il n'est pas distribué sous forme d'un paquet dmg installable par glisser / déposer comme les autres logiciels Mac - donc disposer d'un compilateur, ce qui dans le monde Mac signifie télécharger et installer les quelques Go de XCode ... bon, ensuite :

There has been an error while running make. Halting the installation.

Il manque à Ruby deux librairies systèmes : readline et libxml2. OSX étant basé sur BSD, on peut lui ajouter de nombreux paquets Gnu/Linux via des portages - j'utilise MacPorts.

sudo port install readline libxml2

un petit café plus tard, retour à l'installation de ruby, auquel il faudra ajouter des arguments --with-xx-dir pour préciser le chemin d'installation de ces dépendances. Nouveau problème, nouveau paquet manquant (libiconv), et cette fois l'astuce macport ne suffit pas. On va donc demander à RVM de résoudre le problème lui même :

rvm pck install iconv

et enfin, 

rvm install 1.9.3 -C --with-readline-dir=/opt/local/lib --with-libxml2-dir=/opt/local/lib --with-iconv-dir=/Users/nicolas/.rvm/usr

et voilà ! Reste plus qu'à choisir cette version comme interpreteur Ruby par défaut (rvm --default use 1.9.3) et on est fin prêt pour utiliser ruby dans une version récente, et installer des paquets Gem sans être root.

Tiens au passage, un petit troll, histoire de ne pas renier mes racines :

{troll:on}
à ceux qui se plaignent de Maven, le gestionnaire de paquets Gem va vous plaire : installation systématique les docs (deux pour le prix d'une : ri et rdoc), conflits de versions - je n'arrivais pas à installer veewee sur mon vagrant avant un downgrade de ce dernier) - etc.
{troll:off}


Ceci dit, je ne connais aucun système de gestion de paquets/dépendance qui ai résolu de manière définitive ce problème :D

4 commentaires:

Jean a dit…

Pour les conflits de version et veewee je ne sais pas mais pour la doc il y a les options --no-ri & --no-rdoc. Ces mêmes options peuvent être activées par défaut http://stackoverflow.com/questions/1381725/how-to-make-no-ri-no-rdoc-default-for-gem-install

nicolas deloof a dit…

@Jean toi, tu n'as pas cliqué sur le lien "systématique" :P Je fais du troll utile ;)

Ludovic HOCHET a dit…

http://docs.oracle.com/javase/tutorial/essential/io/links.html#symLink ?

nicolas deloof a dit…

@Ludovic je sais, java 7 corrige un peu le tir. ET comme chacun sait, tout le monde a migré sous Java 7 dès sa sortie, n'est ce pas ?