Desenvolvimento

30 out, 2017

Substituindo RVM/Rbenv/Nvm/etc por ASDF

Publicidade

Muitas pessoas usam o Docker como um meio para ter diferentes versões do Ruby ou para qualquer outra linguagem. Eu ainda acho que a sobrecarga adicional, tanto no uso de recursos, quanto na fricção de usabilidade, simplesmente não vale a pena. Eu absolutamente não recomendo isso. O Docker é ótimo como base para infraestruturas automatizadas, mas eu prefiro usá-las apenas em servidores.

Eu tenho usado asdf como meu principal gerente de versão do Ruby há um longo tempo e estou confiante de que posso recomendá-lo no lugar do RVM ou do Rbenv.

Além disso, ele não só pode gerenciar versões do Ruby, mas pode gerenciar quase todas as linguagens que você deseja, com apenas um conjunto de comandos. Então, você nem precisa de virtualenv para Python ou NVM para Node.js. Basta usar ASDF.

A instalação não poderia ser mais fácil. Basta seguir o README da página do projeto.

Não se esqueça de instalar as ferramentas de desenvolvimento base para o seu ambiente. Você pode seguir a página do wiki do ruby-build, por exemplo:

## For OS X
# optional, but recommended:
brew install openssl libyaml libffi

# required for building Ruby <= 1.9.3-p0:
brew tap homebrew/dupes && brew install apple-gcc42

## For Ubuntu
sudo apt-get install gcc-6 autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev

## For Arch
sudo pacman -S --needed gcc5 base-devel libffi libyaml openssl zlib

Então você pode instalar o próprio ASDF:

git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.4.0

Em seguida, adicione a configuração de ambiente apropriada para Path e autocompletar.

# For Ubuntu or other linux distros
echo -e '\n. $HOME/.asdf/asdf.sh' >> ~/.bashrc
echo -e '\n. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc

# OR for Mac OSX
echo -e '\n. $HOME/.asdf/asdf.sh' >> ~/.bash_profile
echo -e '\n. $HOME/.asdf/completions/asdf.bash' >> ~/.bash_profile

Finalmente, você deve instalar uma das dezenas de plugins. No meu caso, eu tenho estes instalados:

asdf plugin-add clojure https://github.com/vic/asdf-clojure.git
asdf plugin-add elixir https://github.com/asdf-vm/asdf-elixir.git
asdf plugin-add erlang https://github.com/asdf-vm/asdf-erlang.git
asdf plugin-add golang https://github.com/kennyp/asdf-golang.git
asdf plugin-add python https://github.com/tuvistavie/asdf-python.git
asdf plugin-add ruby https://github.com/asdf-vm/asdf-ruby.git

# Imports Node.js release team's OpenPGP keys to main keyring
bash ~/.asdf/plugins/nodejs/bin/import-release-team-keyring

asdf plugin-add nodejs https://github.com/asdf-vm/asdf-nodejs.git

Você pode atualizar todos os plugins de uma só vez com este simples comando:

asdf plugin-update --all

Você pode ver quais versões estão disponíveis para uma linguagem específica:

asdf list-all ruby
asdf list-all clojure
asdf list-all python

E então, você pode instalar qualquer versão de que você precisa:

asdf install ruby 2.4.2
asdf install nodejs 8.7.0
asdf install erlang 20.1

Depois de instalar uma versão de linguagem em particular, eu sempre a configuro como o sistema padrão:

asdf global ruby 2.4.2
asdf global elixir 1.5.2

E em um diretório de projeto específico, posso configurá-lo para usar qualquer outra versão, apenas para esse projeto:

asdf local ruby 2.3.4

O comando acima irá escrever um arquivo .tool-versions para o diretório em que você estiver quando o executou. Ele conterá a linguagem e a versão que você escolher, então, sempre que você voltar para esse diretório, o ASDF definirá a versão correta para a linguagem que você precisa. O comando asdf global <language> anterior está realmente escrevendo um arquivo .tool-versions para o seu diretório pessoal. A configuração local substitui a versão do diretório inicial.

Outra coisa importante a lembrar: sempre que você instala bibliotecas que têm scripts executáveis que precisam estar no PATH, você deve fazer reshim nelas. Por exemplo:

npm install -g phantomjs # will install phantomjs
asdf reshim nodejs # will put the shim for the phantomjs executable in the PATH
phantomjs # will properly execute it

Se você tentar instalar versões do Ruby antes da 2.4, encontrará problemas de compilação, pois ela depende do gcc5 e do openssl-1.0. Então, você deve usar o seguinte comando (assumindo que você já instalou o obsoleto openssl-1.0 e gcc5):

CC=gcc-5 PKG_CONFIG_PATH=/usr/lib/openssl-1.0/pkgconfig \
RUBY_EXTRA_CONFIGURE_OPTIONS="--with-openssl-dir=/usr/lib/openssl-1.0" \
asdf install ruby 2.3.4

Às vezes, se falta uma dependência e uma instalação falha, você deve removê-la manualmente antes de tentar reinstalar, então você deve fazer isto:

asdf remove <language> <version>

Finalmente, se você está acostumado a adicionar algo aos seus arquivos bash ou zsh para mostrar a versão atual da linguagem na linha de comando, provavelmente está usando algo como rvm-prompt. No caso do ASDF, você precisará de um pouco mais:

asdf current ruby | awk -F' ' '{print $1}'

Isso obterá apenas a versão (o comando asdf current aponta que arquivo .tool-versions ele está usando, então esse é um resultado mais longo).

Fora isso, você está pronto. Um gerente de versão para governá-los todos. Não há mais RVM, mais Virtualenv, mais NVM, etc. Você pode viver feliz para sempre!