O que você acha de gerar um executável da sua aplicação Ruby On Rails para fazer um demo ou apresentar para um cliente?
Como o título já diz: O que você acha de gerar um executável da sua aplicação Ruby On Rails para fazer um demo ou apresentar para um cliente?
Pois é, acabei de descobrir que isto é possível
Para isto vamos precisar das seguintes ferramentas:
- Tar2RubyScript - é um utilitário que transforma uma estrutura de diretórios com uma aplicação Ruby em um único arquivo .rb
- RubyScript2Exe - é um utilitário que cria um executável a partir de um script ruby, com a grande vantagem de ja ter todo o necessário para executar este script, ou seja já inclui o Interpretador do Ruby e todas as libs necessárias, o melhor é que ele filtra o que vai se incluido, não sendo necessário incluir toda a stdlib por exemplo.
Para instalar ambos, basta executar os comandos:
$sudo gem install tar2rubyscript $sudo gem install rubyscript2exe
Para começar, vamos criar uma aplicação RoR, mas para poder carregar tudo junto com o executável, vamos utilizar o banco de dados SQLite.
Criando a aplicação
$rails demo $cd demo $ruby script/server
Acesse com o browser o endereço: http://localhost:3000/ para garantir que esta tudo OK.
Criando o banco de dados
$irb
irb(main):005:0> require 'sqlite3'
irb(main):006:0> SQLite3::Database.new("demo_dev.db").execute(
irb(main):007:1* "create table books (id integer primary key, \
irb(main):008:1" title varchar(255), \
irb(main):009:1" author varchar(255));")
E copiaremos o banco criado para as bases de produção e testes:
$cp demo_dev.db demo_test.db $cp demo_dev.db demo_prod.db
Desenvolvendo a aplicação Rails
$vi config/database.yml
Substituimos o conteúdo com algo parecido com isto:
development: adapter: sqlite3 database: demo_dev.db test: adapter: sqlite3 database: demo_tst.db production: adapter: sqlite3 database: demo_prd.db
Criamos o model e o controller:
$script/generate model Book $script/generate controller Book $vim app/controllers/book_controller.rb
E alteramos o código para algo parecido com isto:
class BookController < ApplicationController scaffold :book end
$script/server
Acesse com o browser o endereço http://localhost:3000/book para ver se esta tudo OK.
Criando o Ruby Archive
Agora a parte nova (fala sério, até o meu gato já sabe criar um CRUD com scaffold
)
O comando Tar2RubyScript cria um pacote para a aplicação, mas quando executado, ele descompacta tudo em um diretório temporário e no final da execução ele limpa o diretório, o que não é exatamente o comportamento esperado, então vamos mover os dados para um local seguro antes da execução …
$vi config.environment.rb
E vamos adicionar o seguinte código no inicio do arquivo:
module Rails
class Configuration
def database_configuration
conf = YAML::load(ERB.new(IO.read(database_configuration_file)).result)
if defined?(TAR2RUBYSCRIPT)
conf.each do |k, v|
if v["adapter"] =~ /^sqlite3/
v["database"] = oldlocation(v["database"]) if v.include?("database")
v["dbfile"] = oldlocation(v["dbfile"]) if v.include?("dbfile")
end
end
end
conf
end
end
end
Isto vai alterar a forma como o rails encontra o banco de dados, que originalmente estava definido assim:
module Rails
class Configuration
def database_configuration
YAML::load(ERB.new(IO.read(database_configuration_file)).result)
end
end
end
O que exatamente foi feito? quando executado um RBA precisa tratar dois diretórios diferentes: o diretório onde aplicação esta sendo executada, e o diretório onde a aplicação esta realmente ( referenciado como oldlocation), o código apresentado altera as configurações do database.yml colocando o caminho completo para o banco de dados e não apenas o nome do arquivo como seria utilizado em uma aplicação normal.
O Tar2RubScript precisa também de um arquivo chamado init.rb que sera o ponto de partida da aplicação, vamos cria-lo com o seguinte conteúdo:
$vi init.rb
at_exit do require "irb" require "drb/acl" require "sqlite3" end load "script/server"
Os ‘require’ adicionados são para facilitar a detecção de quais bibliotecas o programa utiliza, ja que o Rails carrega algumas delas apenas durante a execução do sistema, assim o Tar2RubyScript vai poder incluir estas bibliotecas também no executável gerado.
Agora vamos finalmente empacotar a aplicação:
$cd .. $tar2rubyscript demo $cp demo/demo_* .
Prontinho, ja podemos testar o nosso Ruby Archive
$ruby demo.rb
Pode acessar novamente a aplicação pela URL: http://localhost:3000/book
Criando um executável para levar para o cliente
Criar o executável não é nada complicado, basta executar o comando:
$rubyscript2exe demo.rb
Depois que o rails inicializar, precione CTRL+C e sera criado um executável de nome demo.exe, ou demo_linux no linux que é o meu caso.
Basta copiar o executável e os arquivos de banco de dados para o
Conclusões
Não será necessário chegar no cliente e instalar Ruby, RubyGems, Rails, outros Gems, …
Apenas um executável e alguns arquivos de bancos de dados no seu pendrive e esta tudo pronto para o demo
O que você quer melhor que isto?
Na verdade a única coisa que faltou para mim, foi a possibilidade de no linux gerar um executável windows para facilitar os demos, mas mesmo assim, ja esta mais do que bom
PS.: tirei este passo a passo desta URL, eu fiz alguns ajustes no código e traduzi o texto, o maior ajuste foi a utilização de sqlite3 ![]()
Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!



Existe outra opção que também pode ser interessante se você quiser não apenas demonstrar para o cliente durante o desenvolvimento, mas se seu cliente precisar de uma aplicação verdadeiramente offline. É o Joyent Slingshot. Recomendo darem uma olhada neste “link”:http://www.treinatom.com.br/betaEventos/maratona/18082008/7.html
O SlingHost é bem legal mesmo

li sobre ele, vou fazer alguns testes para ver no que da
[…] “O que você acha de gerar um executável da sua aplicação Ruby On Rails para fazer um demo ou apre…“: O Rodrigo Urubatan compartilha sua descoberta de duas ferramentas interessantes para Rails. Uma alternativa para o Joyent. […]
Prezados amigos,
eu tenho uma pequena aplicação em Ruby, a qual gostaria de transformar em executável do windows para fazer uma demonstração. Não usa banco de dados ou coisa parecida, é puro Ruby.
Eu tenho a gem rubyscript2exe e dou o comando “rubyscript2exe aplicação.rb”
Ele cria o executável e, quando clico nele, me dá mensagem de que falta libglib.dll e não abre.
O que estou fazendo de errado?
bahh, eu só testei no linux …
mas provavelmente isto qer dizer que tu esta utilizando os bindings de ruby para GTK, por tanto as dlls do GTK tem que estar no PATH para a tua aplicação funcionar …
Bom dia, Urubatan!
Obrigado pela resposta. Vou copiar as dll do GTK2 para a pasta onde coloco os aplicativos e tentar ver se o rubyscript2exe rastreia essas dlls e cria o executável corretamente.
Meu aplicativo com interface gráfica usando o WXRuby não deu problema algum; de forma que eu nem sei quais são as dll dele e se ele possui, hehehehe. É uma gema para o Ruby que testei para ver como ficava, em relação ao GTK2.
Se alguém kiser ver a aparência depois, eu posso enviar o arquivo de alguma forma.
Abraço e obrigado novamente!
Po cara ve se pode me ajudar , eu nao estou consequindo ver seu codigo aqui no forum tem uma parte ali do enviroment
por favor poste denovo se possivel ou mande um email com o codigo ,ha e cara eu nao entendo muito de linux só o basico mesmo
masi me esplica umas coisas !! eu estou trabalhando com windows, entao eu tenho um workspace com meu projeto , entao
quero saber como posso fazer esses comandos
“cmd”
c:\ruby> tar2rubyscript “ProjectNAME”
c:\ruby> rubyscript2exe “ProjectNAME”
bom na parte do banco como faço para botar ele no pendriver
pode disponibilizar algum link pra downloads ou algum exemplo para meu caso?
Atenciosamente Rodolfo Sá
como assim não esta conseguindo ver o código?
não entendi o que você quiz dizer com cmd, e tirando o sinal de “$” e o editor de código que usei (o vi) nada ali esta preso ao linux, tu pode usar o notepad se quiser no lugar do VI.
Opa tudo bem po estou com outra duvida,
aonde eu crio o arquivo $vi init.rb
vi é o editor de textos como eu ja disse, e init.rb é um arquivo que você cria com o conteúdo que eu mostrei …
Uruba estou com uma duvida no sqlite3 , po baixei uma versão aqui que ele mapea meus banco de dados na maquina local,
no caso quero criar um banco de fique no pendriver pra ir junto com a aplicação,
será que no seu exemplo ficou desse jeito? ou vc realmente consequiu criar um banco de dados dentro do pendriver e consequiu transportar para outros lugares
No exemplo o que é feito é carregar o banco no pendrive, quando a aplicação é inicializada ela copia para um diretório temporário, e no final da execução ele copia o banco alterado de volta para o pendrive.
Por tanto se cair a luz durante a execução da aplicação os dados serão perdidos
Mas sim o banco de dados é carregado junto com a aplicação.
vocês não podem esquecer de utilizar a aplicação quando o exe está sendo gerado, pois é nesse momento que o programa vai saber todas as libs que ele deve empacotar, somente depois de fazer um tur completo pelo seu sistema, que deve apertar ctrl+c
abs