sábado, 10 de outubro de 2009

Criando rake tasks

Um ótimo jeito de criar um script Ruby para sua aplicação Rails, principalmente se ele precisar ter o ambiente do Rails carregado, é através de rake tasks.

Quando eu ouvia falar de criar rake tasks eu achava que devia ser algo complexo, mas esses dias precisei criar um script Ruby para popular o banco de minha aplicação e o Cassio Marques me falou pra dar uma olhada nesse tipo de arquivo, me impressionei com o quão simples é criar uma.

Para criar uma rake task crie um arquivo com a extensão .rake dentro do diretório lib/tasks de sua aplicação. Exemplo:

lib/tasks/example.rake

Dentro do arquivo abra um bloco como o do exemplo:



Dentro desse bloco você pode escrever script Ruby, por exemplo:



A partir daí você já pode executar:

rake my_new_rake_task

O resultado será:

$ rake my_new_rake_task
(in /Users/bruno/projetos/scafold)
Hello


Você pode também adicionar uma descrição para ela, assim ela aparecerá na lista de taks do rake:



Para ver a sua task na lista execute o comando:

rake -T

Ou, para achar ela de uma forma mais fácil:

rake -T | grep new

Como resultado, dentre a lista que aparecer você encontrará:

rake my_new_rake_task # Just an example

Caso você precise do ambiente Rails carregado para executar o seu script, na hora de abrir o bloco faça da seguinte forma:

task :name => :environment do

Como no exemplo:



Você pode criar mais de uma task por arquivo:



Bom é isso pessoal, a partir daí basta utilizar o poder do Ruby e do Rails para criar as mais diversas tarefas.

Espero que o post ajude e até o próximo.

5 comentários:

Rafaela disse...

Oi,você mora em Vitória,e é neto da Dona Alzira?

Pablo Targa disse...

Opa bixo,

Mó legal esse lance de rake... Seguinte estou procurando um jeito de chamar outras rake tasks apartir de uma inicial... ex.: Tenho que controlar acessos ao sistema apartir dos controllers para isso tenho que mapeá-los no meu banco.

Então eu criei uma task chamada perm:sync que manda tudo o que eu tenho na minha app (controllers e actions) para dentro do banco... Agora eu estou fazendo uma task chamada app:install... que no mais vai rodar o db:create, db:migrate, perm:sync, criar admin do sistema, etc... estou procurando um jeito mais fancy do que `aspas nojentas`.

Se souber de algo responde ae...

abs...

Bruno Grasselli disse...

Olá Pablo,

Então, acho que não conheço nada mais fancy.

Geralmente a gente usa `comando` quando queremos guardar o resultado numa variável. Exemplo:

result = `rake db:migrate`

Se essa não é a intenção, você pode usar também:

system 'rake db:migrate'

Ou até, mais explícito:

Kernel.system 'rake db:migrate'

Abraços,

Bruno.

Pablo Targa disse...

Great!

Mas acho que vou continuar com essas nasty quotes, até que não ficou tão estranho assim:

namespace :app do
task :install do
puts `rake db:create`
puts `rake db:migrate`
puts `rake perm:sync`
puts `rake app:create_user_roles`
end
end

Valew ae pela dica!!

abs,

Targa

Bruno Grasselli disse...

Ok Pablo,

Mas se você utilizar o "system" você não precisa usar o "puts".

Abraços.