Fernando Luizão

Desenvolvimento de software e nerdices em geral

Posts Tagged ‘ambiente

Organizando seus projetos Ruby com RVM

with 19 comments

O RVM (Ruby Version Manager) é uma ótima ferramenta para gerenciar versões de ruby diferentes, mantendo todas as versões instaladas dentro do seu home, sem necessidade de uma conta de superusuário. Além de permitir instalar e usar várias versões, ele tem outros recursos interessantes que podem ser usados para manter organização entre projetos com gems diferentes. Vou explicar como eu costumo trabalhar, meu workflow básico e também algumas dicas de uso do RVM. Se você nunca ouviu falar nele, recomendo uma visita ao site do projeto.

Instalando

Para instalar o RVM é necessário o curl, git e bash (nunca testei em outros shell’s), e você também
vai precisar de ferramentas de desenvolvimento para compilar os rubis (gcc, make, etc). Depois de instalar as dependências, instale o RVM com o comando:

bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )

Depois de instalado, edite (ou crie) seu ~/.bashrc e adicione o seguinte ao fim dele:

if [[ -s ~/.rvm/scripts/rvm ]]
then
    source ~/.rvm/scripts/rvm
    source ~/.rvm/scripts/completion
    rvm reload
fi

Com isso o RVM será carregado e também será possível completar comandos do RVM usando o TAB. Agora regarregue seu bashrc:

source ~/.bashrc

Pronto, já podemos instalar nossos rubies, porém, antes de instalar qualquer coisa quero explicar o conceito de gemset do RVM. Gemsets permitem manter conjuntos de gems separados, dentro de uma mesma versão de Ruby. Quando você está usando um gemset, tem acesso apenas às gems instaladas nele, em um ambiente isolado. (isso é muito bom para evitar conflitos de versões de gems entre projetos diferentes). Sempre que uma versão do Ruby é instalada o RVM cria automaticamente dois gemsets, default e global. O gemset default é usado sempre que não for especificado qual gemset deseja-se utilizar. O gemset global é compartilhado entre todos os gemsets, ou seja, todas as gems instaladas no gemset global são visíveis nos outros gemsets da versão. Ao instalar uma versão de Ruby, o RVM verifica nos arquivos ~/.rvm/gemsets/global.gems e ~/.rvm/gemsets/default.gems quais gems devem ser instaladas nos respectivos gemsets, junto com o interpretador. Eu altero o arquivo ~/.rvm/gemsets/global.gems e adiciono as seguintes gems:


rake
bundler
pg
sqlite3-ruby
mysql
rspec

Assim, sempre que eu instalar um novo Ruby essas gems também serão instaladas automaticamente no gemset global, me poupando algum tempo :). Se você não quiser fazer isso não precisa, é só um truque que eu uso para agilizar um pouco ;).

Agora podemos instalar nossos rubis. Para ver uma lista dos rubies que podem ser instalados, digite:

rvm list known

Instalar uma versão do Ruby é simples:

rvm install versao # ou versões separadas por vírgula

Eu instalo os seguintes:

rvm install 1.8.6,1.8.7,1.9.1,1.9.2,ree

O RVM vai baixar e compilar as versões selecionadas. Para usar alguma versão:

rvm use 1.9.1
# ou
rvm 1.9.1

Conferindo a versão do ruby:

ruby -v

Recomendo que vc escolha alguma versão como a default, eu deixo a 1.8.7 como default:

rvm 1.8.7 --default

Sempre que você abrir um novo shell a versão default já será usada. Se vc estiver usando outra versão e
quiser mudar para a versão default é só usar

rvm use default

Para ver qual é o ruby default:

rvm list default

Para listar todas versões instaladas:

rvm list

Para ver informações sobre uma versão (paths, variáveis de ambiente):

rvm info versao

Para remover totalmente uma versão:

rvm remove versao --gems --archive

Trabalhando com gemsets

Como dito anteriormente, gemsets permitem isolar gems dentro de uma mesma versão. Para criar um gemset:

rvm gemset create nome_gemset

Usando um gemset:

rvm gemset nome_gemset
# ou
rvm gemset versao@nome_gemset

Para criar um gemset e já usá-lo:

rvm --create use versao@nome_gemset

Todas as gems que você instalar quando estiver usando o gemset ficarão confinadas a ele.
Na listagem de gems aparecerão apenas as gems do gemset e as do gemset global.
Se vc quiser instalar uma nova gem ao gemset global, use:

rvm gemset use global
gem install nome_da_gem

Para ver qual gemset está sendo usado:

rvm gemset name

Listando todos os gemsets disponíveis para a versão:

rvm gemset list

Apagando um gemset e as gems contidas nele (–force serve para não pedir confirmação):

rvm --force gemset delete nome_gemset

Como manter gems separadas por projeto

Sempre que vc muda para um diretório (cd diretorio), o RVM verifica se existe um .rvmrc dentro dele.
Esse arquivo é um shell script que pode conter qualquer código necessário para inicializar o ambiente do projeto. Por exemplo, se vc quiser que um gemset xuxu seja carregado com a versão default sempre que você entrar no diretório do projeto, bastaria criar um .rvmrc com o conteúdo:

rvm default@xuxu

Com isso em mente, padronizei o setup dos meus projetos para:

mkdir nome_projeto
cd nome_projeto
rvm --create --rvmrc use default@nome_projeto

O último comando vai criar um gemset para o projeto, e também o .rvmrc para carregar o gemset correto.
Como eu também estou usando o bundler, eu crio um Gemfile, listando as dependências do projeto, (mesmo em projetos antigos, com Rails 1.2.6). Depois é só instalá-las com:

bundle install

Assim, tenho um ambiente de gems isolado para cada projeto, e o melhor, toda vez que eu mudar para o diretório de um projeto, o RVM já vai carregar o gemset correto com base no .rvmrc!

Rodando seus testes com RVM

Uma das coisas mais úteis do RVM é facilitar a execução testes em várias versões de Ruby diferentes. Por exemplo, para rodar sua suíte de testes em todas as versões de ruby instaladas:

# no caso de Rspec
rvm specs
# caso use Test::Unit
rvm tests

Também dá pra limitar a apenas algumas versões

rvm 1.8.6,1.8.7,1.9.1 specs

Se for necessário carregar um gemset específico para o projeto, pode ser feito da seguinte maneira

rvm 1.8.7@nome_gemset,1.9.1@nome_gemset specs

Finalizando

O RVM mudou muito meu jeito de trabalhar, essa é a forma que eu atualmente uso para manter meus projetos. Não quer dizer que é a melhor maneira, ou que você deve fazer da mesma forma. Esse post serve mais para dar uma idéia das possibilidades de uso do RVM, e servir como uma referência pra mim mesmo, pra consolidar meu workflow :). Se alguém quiser compartilhar outras dicas para organização de projetos sinta-se livre!

Referências:

http://rvm.beginrescueend.com/
http://bcardarella.com/post/699582642/rvm-gemsets-bundler-awesome

Advertisements

Written by fernandoluizao

August 26, 2010 at 12:34 am

Posted in Ruby, Shell Script

Tagged with , ,