Faire fonctionner Elixir sur un Mac M1 avec Rosetta

Au travail, je suis récement passé sur un nouveau Mac avec leur processeur propriétaire M1. Ces nouveaux processeurs posent pas mal de problèmes, en particulier pour les développeurs, car un grand nombre de choses ne fonctionnent pas avec. Heureusement, Apple a prévu le coup et nous propose d’utiliser Rosetta pour traduire les instuctions x86_64 pour la puce M1. C’est parfait, j’ai pu installer mon environnement de travail (brew, docker et pyenv principalement), faire fonctionner tous mes tests unitaires : tout va bien. 😀

Par contre, il se trouve que j’aime bien essayer Elixir qui est à mon avis un language élégant et plaisant à utiliser. J’installe donc comme auparavant avec brew :

brew install elixir

Erlang et Elixir s’installent sans problème apparent, je me sens bien. Je vais dans un projet Elixir et lance mix deps.get pour aller chercher les dépendances du projet, mais j’obtiens le message Segmentation fault: 11. 😒

Après quelques recherches, il s’avère que pour le moment, pour faire fonctionner Elixir sur un Mac M1, il faut désactiver Rosetta de son Terminal, ce qui m’empêcherait de travailler normalement par ailleurs… puisque j’ai besoin de Rosetta pour le reste !

Évidemment, docker est (presque toujours) la solution, à la rescousse dans ce genre de situation ! Avec un simple alias shell, je vais pouvoir lancer mix (l’outil de build dans le monde Elixir) ou iex (le shell interractif d’Elixir) sans problèmes :

alias mix='docker container run --rm -it -v $PWD:/data -v elixir-mix:/root/.mix -w /data elixir:1.12 mix'
alias iex='docker container run --rm -it -v $PWD:/data -v elixir-mix:/root/.mix -w /data elixir:1.12 iex'

Ces alias permettent de travailler sereinement, comme si Elixir était installé normalement. Le résultat des dépendances se retrouve dans le dossier deps local, le résultat des compilations dans le dossier _build local et habituel, et pas besoin de réinstaller rebar à chaque lancement de la commande (il m’a fallu jouer un peu avec les volumes docker, mais l’article Running Elixir in Docker Containers m’a permis de me mettre le pied à l’étrier).

Il faudrait explorer les aspects réseau pour aller plus loin, mais pour le moment, cela me suffit largement.

En attendant, enjoy ! 😉

NB : attention, l’image docker pour Elixir pèse plus de 1,1 Go…

Réactions