Blog do Urubatan
msgbartop
Desenvolvedor, Palestrante, Escritor, Nerd Assumido e Pai do Marcus :D
msgbarbottom

25 Aug 07 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 :D

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 :D )

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 :D

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 :D

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 :D

If you enjoyed this post, make sure you subscribe to my RSS feed!

Tags: ,

Reader's Comments

  1. |

    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

    Reply to this comment
  2. |

    O SlingHost é bem legal mesmo :D
    li sobre ele, vou fazer alguns testes para ver no que da :D

    Reply to this comment
  3. |

    [...] “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. [...]

    Reply to this comment
  4. |

    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?

    Reply to this comment
  5. |

    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 …

    Reply to this comment
  6. |

    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!

    Reply to this comment
  7. |

    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á

    Reply to this comment
  8. |

    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.

    Reply to this comment
  9. |

    Opa tudo bem po estou com outra duvida,
    aonde eu crio o arquivo $vi init.rb

    Reply to this comment
  10. |

    vi é o editor de textos como eu ja disse, e init.rb é um arquivo que você cria com o conteúdo que eu mostrei …

    Reply to this comment
  11. |

    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

    Reply to this comment
  12. |

    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 :D
    Mas sim o banco de dados é carregado junto com a aplicação.

    Reply to this comment
  13. |

    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

    Reply to this comment

Leave a Comment