Archive for the ‘Shell Script’ Category
Organizando seus projetos Ruby com RVM
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
Me recomende