<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>codificando.com &#187; rvm</title>
	<atom:link href="http://codificando.com/tag/rvm/feed/" rel="self" type="application/rss+xml" />
	<link>http://codificando.com</link>
	<description>Desenvolvimento de Software com qualidade</description>
	<lastBuildDate>Tue, 31 Jan 2012 09:49:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>RVM com Passenger e múltiplas instâncias HTTPD</title>
		<link>http://codificando.com/2010/07/rvm-passenger-multiplas-instancias-httpd/</link>
		<comments>http://codificando.com/2010/07/rvm-passenger-multiplas-instancias-httpd/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 19:31:29 +0000</pubDate>
		<dc:creator>Emerson Macedo</dc:creator>
				<category><![CDATA[infra]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[deploy]]></category>
		<category><![CDATA[passenger]]></category>
		<category><![CDATA[rvm]]></category>

		<guid isPermaLink="false">http://codificando.com/?p=500</guid>
		<description><![CDATA[No artigo anterior, falei sobre sobre RVM (Ruby Version Manager), explicando sobre instalação, configuração e seu funcionamento interno. Porém, não mencionei nada sobre seu uso com o Phusion Passenger (A.K.A mod_rails, mod_rack), e algumas pessoas me perguntaram sobre isso. Eu &#8230; <a href="http://codificando.com/2010/07/rvm-passenger-multiplas-instancias-httpd/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>No <a href="http://codificando.com/2010/07/gerencie-ambiente-ruby-rvm/">artigo anterior</a>, falei sobre sobre <a href="http://rvm.beginrescueend.com/" target="_blank">RVM (Ruby Version Manager)</a>, explicando sobre instalação, configuração e seu funcionamento interno. Porém, não mencionei nada sobre seu uso com o <a href="http://www.modrails.com/" target="_blank">Phusion Passenger (A.K.A mod_rails, mod_rack)</a>, e algumas pessoas me perguntaram sobre isso. Eu não abordei essa parte no artigo anterior por duas razões: A primeira é porque já era madrugada e o sono já me dominava <img src='http://codificando.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  e a segunda porque o artigo iria ficar muito grande e o conteúdo inicial já era suficiente para montar um ambiente local na máquina do desenvolvedor.</p>
<p>Esse artigo basea-se no uso do <a href="http://httpd.apache.org/" target="_blank">Apache 2.x</a> e no <a href="http://www.apple.com/macosx/" target="_blank">Sistema Operacional OSX</a>. Porém, as configurações em SOs <a href="http://en.wikipedia.org/wiki/POSIX" target="_blank">POSIX</a> se assemelham, portanto usuários do <a href="http://www.ubuntu.com/" target="_blank">Ubuntu</a> e afins não deverão ter nenhum problema.</p>
<h3><strong>Instalando o Passenger em uma Rubie/Gemset</strong></h3>
<p>Se você já usa RVM ou seguiu os passos do <a href="http://codificando.com/2010/07/gerencie-ambiente-ruby-rvm/">artigo anterior</a>, já deve ter tudo instalado e configurado e já possui uma Rubie com ou sem Gemsets (não faz diferença ter Gemsets para esse artigo). Caso contrário, leia novamente.</p>
<p>Abra o terminal e entre na sua Rubie/Gemset, instale a gem do passenger e o módulo do apache (ou nginx):</p>
<p><strong>$ rvm use rubie@gemset </strong><strong><span style="font-weight: normal;">#ex: rvm use 1.8.7@minhaapp</span><br />
$ gem install passenger<br />
$ rvmsudo passenger-install-apache2-module</strong></p>
<p>Muita atenção nesse momento. A instalação do módulo do apache (ou nginx) deve ser feita usando rvmsudo. Sem isso não funcionou comigo e acho que com ninguém vai funcionar <img src='http://codificando.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Feito isso, no fim da instalação do módulo ele vai mandar você colocar aquelas 3 linhas de configuração do Passenger nas suas configs do apache. Eu sugiro criar um arquivo <strong>passenger.conf</strong> ou similar e colar esse código dentro desse arquivo, pra não misturar com as configs básicas do Servidor Http. Se você estiver usando Mac, as configurações do apache provavelmente estarão em <strong>/etc/apache2</strong> e existe um diretório <strong>other</strong>, onde colocamos as configurações adicionais, como esta que acabamos de criar para o passenger.</p>
<p>Agora precisamos ajustar um detalhe nessas configurações do Passenger. Quando instalamos o Passenger e módulo do apache em uma RVM, a terceira linha da configuração (PassengerRuby) que a instalação sugere, não aponta para o diretório correto, e não funciona. É necessário fazer uma modificação e vou explicar.</p>
<p>Quando instalamos a RMV, ele cria um diretório chamado <strong>~/.rvm/bin</strong>, onde ficam todos os executáveis das rubies (ruby, irb, gem, ri, rdoc). A instalação do Passenger não entende isso e aponta para uma estrutura diferente, formada da seguinte maneira: <strong>~/.rvm/rubies/{Rubie}/bin/ruby</strong>, e isso não funciona. Portanto, precisamos alterar essa linha para que fique da segunte forma:</p>
<p><strong>$ PassengerRuby ~/.rvm/bin/{Rubie}@{Gemset}</strong></p>
<p>A documentação sugere uma forma diferente dessa, nos indicando executar <strong>rvm {Rubie@Gemset} &#8211;passenger</strong> e substituir essa terceira linha da segunte forma:</p>
<p><strong>$ PassengerRuby ~/.rvm/bin/passenger_ruby</strong></p>
<p>O que isso faz é criar um link symbólico de <strong>passenger_ruby</strong> apontando para o <strong>{Rubie}@{Gemset}</strong> que você quer. Eu acho isso desnecessário, principalmente porque você pode querer usar o passenger com várias Rubies diferentes, que é o que vou abordar mais adiante. Portanto, eu prefiro ficar com a primeira opção.</p>
<p>Agora basta configurar o VirtualHost (presumo que você já sabiba fazer isso) e reiniciar o Apache. Nesse momento tudo já deve estar funcionando corretamente e você deve estar conseguindo ver sua aplicação funcionando. Não se esqueça de configurar o <strong>/etc/hosts</strong> (é bastante comum ver gente capotando porque esqueceu essa parte, rs).</p>
<h3><strong>Múltiplas apps em Rubies diferentes</strong></h3>
<p>Segundo a documentação do Passenger, <a href="http://www.modrails.com/documentation/Users%20guide%20Apache.html#PassengerRuby" target="_blank">a diretiva PassengerRuby deve ser usada apenas uma vez</a>, nos limitando a ter nossas aplicações em uma Rubie/Gemset única. Uma maneira comum de trabalhar com essa limitação é instalar o <a href="http://www.rubyenterpriseedition.com/" target="_blank">Ruby Enterprise Edition (i.e. Ruby EE)</a> ou qualquer versão de Ruby e instalar todas as gems de todos os projetos nessa Rubie. A partir daí, basta criar um VirtualHost para cada Aplicação. Essa era a forma que trabalhavamos sem RVM. Com RVM a idéia e sair dessa limitação, podendo por exemplo rodar uma app usando Ruby 1.8.7 com Rails 2.3 e outra com Ruby 1.9.2 e Rails3. Isso inclusive num ambiente de produção, isolando bem as apps e evitando conflitos. Vamos portanto resolver o problema de outra maneira.</p>
<h3><strong>Criando uma nova configuração para o Apache</strong></h3>
<p>Talvez você não saiba, mas o diretório <strong>/etc/apache2</strong> não é o servidor Apache HTTPD propriamente dito, mas as configurações que esse servidor usa quando você sobe a instância. Por padrão, o <strong>apachectl</strong> procura as configurações nesse diretório, mas é perfeitamente possível indicar o path do arquivo de configuração que você quer usar, e é baseado nisto que vamos usar uma alternativa melhor.</p>
<p>Antes de qualquer coisa, vamos trocar alguns parâmetros na configuração default do Apache, para podermos rodar mais de uma instância sem nenhum tipo de problema acidental. Por padrão, nas configurações em <strong>/etc/apache2/httpd.conf</strong> tem um <strong>Listen</strong> definito para <strong>*:80</strong>. Vamos mudar isso:</p>
<p><strong>Listen 127.0.0.1:80</strong></p>
<p>Mudemos também quaisquer configurações de VirtualHost existentes que estejam usando *:80:</p>
<p><strong>VirtualHost 127.0.0.1:80</strong></p>
<p>Agora chegou a hora de clonar essas configurações para uma nova. Esse trabalho é um pouco chato, portanto resolvi criar um Shell Script para isso chamado <a href="http://gist.github.com/481665">osx-clone-apache.sh</a> que pode ser <a href="http://gist.github.com/raw/481665/63fe90110b0466a186b28d8be05a4e5194ab2db4/osx-clone-apache.sh" target="_blank">baixado aqui</a> e está no <a href="http://gist.github.com/emerleite" target="_blank">meu gist</a>. Já testei no Snow Leopard e Leopard. Se alguém quiser fazer um para ubuntu e outros SOs é bem vindo e eu coloco como update no artigo.</p>
<p>Baixe o Script e execute a seguinte linha no terminal:</p>
<p><strong>$ sudo ./osx-clone-apache.sh http-clone 127.0.0.1:80 127.0.0.2:80</strong></p>
<p>Onde <strong>http-clone</strong> é o nome da nova configuração que será criada dentro de <strong>/etc</strong>, <strong>127.0.0.1:80</strong> é o <strong>Listen</strong> que está configurado em <strong>/etc/apache2</strong> e <strong>127.0.0.2:80</strong> é o novo <strong>Listen</strong>. Essa nova configuração <strong>não leva nada do diretório other nem do passenger_pane_vhosts</strong> se você estiver usando o <a href="http://www.fngtps.com/passenger-preference-pane" target="_blank">Passenger Preference Pane</a>.</p>
<p>Agora que temos uma nova config do apache apontando para 127.0.0.2:80 precisamos configurar nossa interface de rede para passar a responder a esse ip:</p>
<p><strong>$ ifconfig lo0 alias 127.0.0.2/32</strong></p>
<p>Se não me engano, no Ubuntu isso não é necessário, mas no Mac eu não conheço outra forma de fazer isso. Se alguém souber é bem vindo.</p>
<p>Nesse ponto basta repetir os mesmos procedimentos de configuração de Passenger para novas Rubies e Gemsets para essa nova configuração do apache que acabamos de criar. Mais uma vez não esqueça de ajustar suas configurações no <strong>/etc/hosts</strong>.</p>
<p>O último passo é subir uma instância do apache usando as novas configurações criadas.</p>
<p><strong>$ sudo apachectl -f /etc/{novaconfig}/httpd.conf -k start</strong></p>
<p>Pronto, você já tem 2 instâncias do Apache rodando versões de Ruby/Rails diferentes na mesma máquina.</p>
<h3><strong>Conclusão</strong></h3>
<p>O RVM (Ruby Version Manager) trouxe uma nova perspectiva no gerênciamento de ambientes Ruby/Rails. O Deploy de Aplicações com versões de Ruby e Rails usando Phusion Passenger numa mesma máquina se torna trivial, desde que se saiba o que está fazendo. As configurações apresentadas neste artigo podem (e acho que devem) ser usadas também em ambiente de produção, pois a SANDBOX criada é muito mais simples de ser gerênciada do que aquela mistura habitual de VirtualHosts, Gems e afins.</p>
<p>Mãos a obra !!!
<p><font color="#B4B4B4" size="-2">Post Footer automatically generated by <a href="http://www.freetimefoto.com/add_post_footer_plugin_wordpress" style="color: #B4B4B4; text-decoration:underline;">Add Post Footer Plugin</a> for wordpress.</font></p>
]]></content:encoded>
			<wfw:commentRss>http://codificando.com/2010/07/rvm-passenger-multiplas-instancias-httpd/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Gerencie seu ambiente Ruby com RVM</title>
		<link>http://codificando.com/2010/07/gerencie-ambiente-ruby-rvm/</link>
		<comments>http://codificando.com/2010/07/gerencie-ambiente-ruby-rvm/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 03:52:05 +0000</pubDate>
		<dc:creator>Emerson Macedo</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jruby]]></category>
		<category><![CDATA[pragmatic]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ferramentas]]></category>
		<category><![CDATA[rvm]]></category>

		<guid isPermaLink="false">http://codificando.com/?p=461</guid>
		<description><![CDATA[Introdução Ruby 1.8, Ruby 1.9, Rails 2, Rails 3, cada projeto usando diversas gems. Como isolar esses ambientes para evitar conflitos? Em Outubro de 2007, surgiu uma ferramenta chamada RVM, com o objetivo de criar ambientes isolados para desenvolver software &#8230; <a href="http://codificando.com/2010/07/gerencie-ambiente-ruby-rvm/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h3><strong>Introdução</strong></h3>
<p>Ruby 1.8, Ruby 1.9, Rails 2, Rails 3, cada projeto usando diversas gems. Como isolar esses ambientes para evitar conflitos?</p>
<p>Em Outubro de 2007, surgiu uma ferramenta chamada <a href="http://rvm.beginrescueend.com/">RVM</a>, com o objetivo de criar ambientes isolados para desenvolver software em Ruby, permitindo que programadores pudessem usar várias versões de Ruby e Gems numa mesma máquina de forma limpa e sem conflitos. O projeto vem se tornando mais popular este ano, e de fato tem se mostrado muito útil. A lista dos autores pode ser conferida <a href="http://beginrescueend.com/authors" target="_blank">aqui</a>.</p>
<h3><strong>Instalação</strong></h3>
<p>Para instalar o RVM, não é preciso muita coisa além de um ambiente POSIX (linux, bsd, etc). Eu instalei no meu Mac sem problemas. Eu acho que a única coisa que não vem por padrão que você precisa instalar é o <a href="http://git-scm.com/" target="_blank">git</a>, que é usado para instalar/atualizar o RVM e instalar/atualizar as versões de Ruby.</p>
<p>Dito isso, abra o terminal e execute o seguinte comando:</p>
<p><strong>$ bash &lt; &lt;( curl http://rvm.beginrescueend.com/releases/rvm-install-head )</strong></p>
<p>O procedimento não deve demorar mais que alguns minutos, dependendo da sua conexão. Em seguida, abra seu profile (.bash_profile, .profile, .bashrc, etc) e adicione as seguintes linhas:</p>
<p><strong>[[ -s "$HOME/.rvm/scripts/rvm" ]] &amp;&amp; source &#8220;$HOME/.rvm/scripts/rvm&#8221;<br />
PS1=&#8221;\$(~/.rvm/bin/rvm-prompt) $PS1&#8243;<br />
</strong><br />
A segunda linha é para que a versão do Ruby que você estiver usando apareça no prompt, caso contrário você vai precisar ficar verificando a todo momento qual versão você está usando e isso pode ser bem chato.</p>
<p>Em seguida, carregue o rvm (da próxima vez que abrir o shell isso não será mais necessário):</p>
<p><strong>$ source ~/.rvm/scripts/rvm</strong></p>
<p>Pronto, o RVM está instalado e é hora de começar a arrumar nosso ambiente.</p>
<h3><strong>Instalando versões de Ruby</strong></h3>
<p>A partir do RVM, é possível instalar qualquer implementação Ruby. Por exemplo, podemos instalar o Ruby, Ruby Enterprise e o Jruby. Para uma lista completa acesse <a href="http://rvm.beginrescueend.com/interpreters/" target="_blank">aqui</a>.</p>
<p>Nesse tutorial, vamos instalar o ruby 1.8.7 . Execute o comando abaixo no terminal:</p>
<p><strong>$ rvm install 1.8.7</strong></p>
<p>1.8.7 é um atalho para o último patchlevel da verão 1.8.7 do Ruby. Em geral, isso funciona para todas as versões. A instalação demora um pouquinho, mas nada absurdo, portanto vá tomar um café e volte. Após o termino, &#8220;entre&#8221; no ambiente do Ruby instalado.</p>
<p><strong>$ rvm &#8211;default 1.8.7</strong></p>
<p>Nesse momento, você entrou no Ruby 1.8.7 e definiu essa VM como default no RVM.</p>
<p>Para voltar ao Ruby do systema (fora da RVM), basta ir no shell e digital:</p>
<p><strong>$ rvm use system</strong></p>
<p>Para listar as VMs instaladas (ou Rubies como preferem os criadores e como chamaremos a partir de agora), basta digitar:</p>
<p><strong>$ rvm list</strong></p>
<p>Escolha a Rubie e use-a conforme o exemplo abaixo:</p>
<p><strong>$ rvm use 1.8.7</strong></p>
<h3><strong>Instalando as Gems</strong></h3>
<p>Uma das manias que a maioria dos Rubistas tem é instalar as gems usando sudo. Isso hoje em dia é considerado má prática. Ainda mais com RVM, já que a intenção é criar uma espécie de SANDBOX por usuário/aplicação, conforme veremos a seguir.</p>
<p>Primeiramente vamos ver as gems que estão instaladas na nova Rubie. O comando é o já conhecido gem list. Ao rodar esse comando na Rubie instalada pelo RVM, você pode ter a impressão que suas gems sumiram, mas na verdade isso é exatamente o esperado, pois cada Rubie tem seu ambiente totalmente isolado. Para ter uma idéia, rode o seguinte comando e veja o output:</p>
<p><strong>$ rvm info</strong></p>
<p>O output fornece toda a informação sobre o ambiente dessa Rubie que está sendo usada no momento. Observe bem a linha home: \n gem:. Nela você verá onde estão sendo instaladas as gems. Repare que ele cria uma estrutura de diretórios sugestiva para você manter suas gems bem isoladas. A estrutura é a seguinte:</p>
<p><strong>~/.rvm/gems/{Rubie@Gemset}/</strong></p>
<p>Todas as gems serão instaladas nesse diretório. Não estranhe o <strong>@Gemset</strong>, falaremos dele adiante.</p>
<p>Vamos então instalar o Rails nessa Rubie. Não use sudo pelo amor de Deus <img src='http://codificando.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>$ gem install rails &#8211;no-ri &#8211;no-rdoc</strong></p>
<p>Depois execute um gem list para ver seu ambiente instalado. Se quiser, execute rvm system e veja que suas gems no ruby do sistema provavelmente são totalmente diferentes.</p>
<h3><strong>Gemsets</strong></h3>
<p>Vamos falar agora do tal @Gemset que eu coloquei na estrutura. Gemsets é uma forma de criar uma SANDBOX mais &#8220;profunda&#8221;. Em um primeiro momento pode parecer desnecessário, mas se você pensar que pode ter mais de um projeto por Rubie e não quer que as gems deles se misturem nem gerem algum tipo de conflito, essa estrutura passa a fazer todo sentido.</p>
<p>Supunha que você tenha um projeto chamado blog. Para criar uma gemset (e entrar nele) para esse projeto basta executar o seguinte comando:</p>
<p><strong>$ rvm gemset create blog &amp;&amp; rvm gemset use blog</strong></p>
<p>Feito isso você verá que no seu prompt (se você fez essa configuração de instalação) estará aparecendo da seguinte forma: <strong>rubie@gemset</strong>. Rode o comando gemlist e verá que novamente suas gems que foram instaladas na Rubie sumiram. Mais uma vez isso é esperado, pois acabamos de criar uma nova SANDBOX para esse projeto específico. Nesse momento, basta instalar suas gems nessa gemset que seu projeto terá um ambiente totalmente isolado.</p>
<p>Se você executar o rvm info, verá que a home das suas gems está com um path diferente do anterior, pois o rvm criou um diretório para a Ruby com a nova Gemset, deixando tudo muito bem organizado.</p>
<p>Existem algumas gems que todos os projetos podem precisar, como Rake e Capistrano. Não seria uma boa idéia instalar essas gems em cada gemset. O RVM nos dá uma ajuda nesse sentido, criando uma gemset global, permitindo compartilhar gems entre todas as gemsets de uma Rubie. Para instalar uma gem nessa gemset basta mudar para ela e installar, como já vimos anteriormente. Vamos a um exemplo:</p>
<p><strong>$ rvm gemset use global<br />
$ gem install capistrano capistrano-ext &#8211;no-ri &#8211;no-rdoc</strong></p>
<p><span style="color: #000000;">Pronto, essas gems não precisam mais ser instaladas para cada projeto novo que você for rodar nessa Rubie.</span></p>
<h3><strong>Conclusão</strong></h3>
<p>O Ruby Version Manager é uma ferramenta muito interessante para gerênciar seu ambiente Ruby. Ter vários Rubies instalado se torna cada vez mais comum, pois os projetos antigos precisam ser mantidos e novos projetos surgem, usando Rubies mais novos. O uso dos gemsets para isolar as gems também faz toda a diferença, evitando diversas dores de cabeça e deixando o ambiente organizado e limpo. Vale a pena experimentar.</p>
<h3><strong>&lt;&lt; UPDATE &gt;&gt;<strong> </strong></strong></h3>
<p><strong><strong><span style="font-weight: normal;">Tem um comando importante que não abordei que é o </span>rvm list known<span style="font-weight: normal;"> que mostra as opções de Rubies disponíveis para instalação. Créditos ao <a href="http://twitter.com/rodvlopes" target="_blank">Rodrigo Lopes</a>.</span></strong></strong></p>
<p><strong><strong> </strong></strong>
<p><font color="#B4B4B4" size="-2">Post Footer automatically generated by <a href="http://www.freetimefoto.com/add_post_footer_plugin_wordpress" style="color: #B4B4B4; text-decoration:underline;">Add Post Footer Plugin</a> for wordpress.</font></p>
]]></content:encoded>
			<wfw:commentRss>http://codificando.com/2010/07/gerencie-ambiente-ruby-rvm/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

