Como instalar minhas Ruby Gems?
De Wiki Locaweb
|
Para utilizar as versões atualizadas do Rails sua hospedagem deve estar em servidor Linux AS-5
|
A Locaweb tem suporte total a aplicações Ruby on Rails, Merb ou qualquer outro framework baseado em Rack (como Sinatra, etc). Isso é possível devido à tecnologia Phusion Passenger. Dentre os diversos serviços que provemos na hospedagem compartilhada está a constante atualização de RubyGems que são pacotes de bibliotecas padrão da linguagem Ruby. O próprio Rails é um conjunto de Gems. A tecnologia RubyGems permite, dentre outras coisas, que existam múltiplas versões da mesma Gem ao mesmo tempo.
Por exemplo, acessando sua hospedagem via SSH, você pode checar todas as Gems instaladas na sua máquina usando este comando:
gem list
Para ver quais versões de Rails (ou outras Gems) estão instaladas, use este comando:
gem list rails
Isso retornará algo parecido com isso:
*** LOCAL GEMS *** rails (2.2.2, 2.1.1, 2.1.0, 2.0.4, 2.0.2, 1.2.6, 1.2.3)
Tabela de conteúdo |
Configurando sua aplicação Rails
Sua aplicação Rails escolhe a versão que quer usar a partir da linha no arquivo 'config/environment.rb' da sua aplicação que diz:
RAILS_GEM_VERSION = '2.1.0' unless defined? RAILS_GEM_VERSION
Observe que o comando 'gem list rails' anterior mostra que existe a versão 2.1.0 e no exemplo acima é exatamente essa a versão explicitada na variável RAILS_GEM_VERSION. Essa linha deve estar descomentada (sem o caracter "#" no começo dela).
CUIDADO: Garanta que esta linha nunca esteja comentada! Por exemplo, você colocou seu projeto no servidor com esta linha comentada. Hoje (dia 30/12/2008) a versão mais recente do Rails é a 2.2.2 e sua aplicação carregará essa versão. Daqui algumas semanas, sairá a versão 2.3.0. Quando isso acontecer, vamos instalar essa versão. Como você comentou a linha de versão acima na sua aplicação, ela automaticamente passará a carregar a versão mais nova sempre, no caso a 2.3. Se essa versão quebrar a compatibilidade com a versão 2.2.2, sua aplicação poderá ter problemas (!) Portanto: nunca comente esta linha.
Antigamente, no mesmo arquivo poderíamos carregar outras gems que quiséssemos, por exemplo:
require 'paperclip' require 'rdiscount'
Isso carregará a versão mais recente, se estiver instalada na máquina. Mas isso não é bom, pois hoje sua aplicação pode funcionar com as versões no servidor, mas quando atualizarmos, sua aplicação poderá quebrar. Isso é um problema da configuração da sua aplicação.
A partir do Rails 2.1 é possível explicitar qual versão você depende, novamente, no mesmo arquivo 'config/environment.rb' procure por linhas parecidas com estas:
# config.gem "bj" # config.gem "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net" # config.gem "aws-s3", :lib => "aws/s3"
Esses são exemplos de como você deve explicitar as gems que você quer. Para consertar o mesmo exemplo que demos acima, poderíamos fazer:
config.gem "rdiscount", :version => '1.2.11' config.gem "paperclip", :version => '2.1.2'
Note, que no servidor, se você digitar "gem list paperclip" no dia de hoje (30/12/2008), ela não aparecerá. Isso porque ela não foi instalada nesse servidor (provavelmente ainda será instalada em breve). Portanto, para colocar sua aplicação na hospedagem, mesmo sem a Gem disponível, você ainda pode fazer algumas coisas.
Congelando as Gems no seu projeto Rails
A partir do Rails 2.1.0, depois que você configurar os "config.gem" conforme mostrado acima, ainda na sua máquina local, você tem a opção de executar estes dois comandos:
rake rails:freeze:gems rake gems:unpack
Feito isso, copie os arquivos do seu projeto para a hospedagem, por exemplo, colocando no diretório "rails_apps/teste", faça login via SSH e depois rode estes comandos:
cd rails_apps/teste rake gems:build
- A tarefa "rails:freeze:gems" congelará todo o framework Rails dentro da sua aplicação, não dependendo mais do Rails instalado na hospedagem.
- A tarefa "gems:unpack" instalará as gems da sua máquina (nas versões especificadas) dentro do diretório "vendor/gems" da sua aplicação
- A tarefa "gems:build" deve ser rodada na hospedagem e ela usará compiladores (GCC) para compilar extensões nativas, caso necessário (no caso dessas duas Gems de exemplo, é necessário)
Isso torna sua aplicação Rails completamente independente das Gems instaladas no servidor, garantindo que sua aplicação nunca terá problemas de versão de Gems.
Instalando as Gems direto na sua Hospedagem
Uma vez feito login via SSH na sua conta remota na hospedagem, verá que o comando "gem install rails", por exemplo, não funcionará, dando um erro de permissão. Isso porque por padrão esse comando tentará gravar suas gems no diretório "/usr/lib/ruby/gems/1.8" onde você, claro, não pode ter permissão de escrita, pois ela é compartilhada entre todos os usuários que compartilham a mesma máquina que vocês.
Porém, você pode escolher instalar suas gems localmente na sua conta. Para fazer isso, depois do login via SSH, rode os seguintes comandos:
mkdir ~/.gems export GEM_HOME="$HOME/.gems" export GEM_PATH="$GEM_HOME" export PATH="$HOME/bin:$HOME/.gems/bin:$PATH"
Isso remapeará o comando 'gem' para gravar tudo dentro do seu diretório, por exemplo, /home/railsdemo/.gems. Sempre que sair e fizer login novamente, rode os mesmos comandos 'export' para que isso sempre funcione.
Cheque a versão do Rubygems instalado na sua máquina:
gem -v
Se a versão for 1.2 ou abaixo, você tem a opção de atualizá-lo somente na sua conta. Desta forma:
wget http://rubyforge.org/frs/download.php/45905/rubygems-1.3.1.tgz tar xvfz rubygems-1.3.1.tgz cd rubygems-1.3.1 ruby setup.rb --prefix=$HOME
Por padrão, o Ruby do sistema operacional tentará ainda carregar o Rubygems antigo instalado em /usr/lib/ruby/site_ruby/1.8. Para que ele dê prioridade ao que você acabou de instalar localmente edite o arquivo "~/bin/gem" e acrescente a seguinte linha na segunda linha do arquivo:
$LOAD_PATH.unshift "/home/railsdemo/lib"
Cheque que a versão como acima e que o binário sendo usado é o que você acabou de instalar:
which gem
Esse comando deveria devolver "/home/railsdemo/bin/gem".
Agora, seguindo o mesmo exemplo acima, em vez de "congelar" as gems dentro do seu projeto, você pode instalá-los na sua hospedagem:
gem install paperclip --version=2.1.2 --no-ri --no-rdoc gem install rdiscount --version=1.2.11 --no-ri --no-rdoc
Daí você precisa fazer uma pequena modificação na sua aplicação Rails para que ele reconheça este diretório. Edite o arquivo 'config/environment.rb' e no final (antes de qualquer comando 'require') ponha as seguintes linhas:
ENV['GEM_PATH'] = '/home/railsdemo/.gems' Gem.clear_paths
Isso fará com que sua aplicação passe a carregar as gems a partir do seu diretório local ".gems". Porém, devido a uma limitação do Phusion Passenger, o próprio Rails não pode ser instalado nesse diretório e requer que - se for necessário - seja congelado dentro do seu projeto como mostrado acima. Se já tiver gravado seu projeto no servidor, faça como neste exemplo:
cd ~/rails_apps/teste rake rails:freeze:edge RELEASE=2.2.2
Caso tenha problemas com Ruby on Rails version '2.2.2' not found execute este comando em sua aplicação rails
Este comando puxará a versão 2.1.0 dos servidores do projeto Ruby on Rails (não é da Locaweb). Assim, seu projeto terá o framework Rails congelado e as outras Gems que você precisa estarão no seu diretório local ".gems".
Ruby Gems e o framework Merb
O framework Merb é parecido com o Ruby on Rails, porém ele tem recebido muitas atualizações e obviamente não é fácil fazer com que todos os servidores sempre estejam acompanhando. Por isso podemos usar o mesmo truque de instalar as Gems localmente no seu diretório home.
Novamente, faça de conta que estamos começando do zero e estamos fazendo login via SSH na sua conta. Rode os seguintes comandos:
mkdir ~/.gems export GEM_HOME="$HOME/.gems" export GEM_PATH="$GEM_HOME" export PATH="$HOME/bin:$HOME/.gems/bin:$PATH"
Para instalar o Merb na versão específica que precisa faça:
gem install merb --version=1.0.6.1 --no-ri --no-rdoc gem install do_mysql --version=0.9.9 --no-ri --no-rdoc
Agora crie o diretório da sua aplicação Merb, digamos:
mkdir -p ~/rack_apps/teste cd ~/rack_apps/teste
Com os arquivos da sua aplicação já copiados lá, precisamos editar alguns arquivos. Primeiro crie um novo arquivo chamado 'config.ru', por exemplo, usando o comando 'vim config.ru'. Se você não conhece o Vim, logo que ele entrar, digite a letra "i" para entrar em modo de edição, e cole o seguinte texto:
ENV['GEM_HOME'] = '/home/railsdemo/.gems'
ENV['GEM_PATH'] = '/home/railsdemo/.gems'
require 'rubygems'
Gem.clear_paths
require 'merb-core'
Merb::Config.setup(:merb_root => File.expand_path(File.dirname(__FILE__)),
:environment => ENV['RACK_ENV'])
Merb.environment = Merb::Config[:environment]
Merb.root = Merb::Config[:merb_root]
Merb::BootLoader.run
run Merb::Rack::Application.new
Claro, troque pelos nomes dos diretórios da sua hospedagem. Se tiver dúvidas quando ao caminho correto use o comando "pwd" que ele dirá, por exempo, "/home/railsdemo".
Agora, vamos editar o arquivo "config/init.rb", acrescentando as seguintes linhas:
ENV['GEM_HOME'] = '/home/railsdemo/.gems' ENV['GEM_PATH'] = '/home/railsdemo/.gems' Gem.clear_paths
Claro, não deixe de configurar seu arquivo "config/database.yml" com os dados que vieram no e-mail de instalação do seu MySQL Incluso - que você deve ter pedido via o Painel de Controle da Hospedagem. Um exemplo seria:
production: adapter: mysql database: railsdemo1 username: railsdemo1 password: xxxxxxxxxxxx host: 200.234.202.110 # mude para o IP ou endereço do servidor que veio no seu dominio
Para criar as tabelas no banco, a partir do diretório da sua aplicação, rode:
rake db:automigrate MERB_ENV=production
Claro, assim como nas aplicações Rails, você já deve ter configurado um domínio apontando para um sub-diretório dentro da pasta "~/public_html". Por exemplo, para "~/public_html/teste". Então crie o link simbólico da sua aplicação Merb para lá, assim:
ln -s ~/rack_apps/teste/public ~/public_html/teste
Pronto. Isso fará com que sua aplicação Merb sempre carregue apenas as gems instaladas no diretório ".gems" da sua hospedagem, tornando-se completamente independente das Gems globais do servidor.
