2011-12-01 10 views
14

Tengo dos tareas Rake bajo el mismo espacio de nombres como siguientes:rastrillo variable de tarea

namespace :db do 
    task :first_task => :environment do 
     server_name='myserver' 
     connect_to(server_name) 
    end 

    task :second_task => :environment do 
      server_name='myserver' 
      do_something_with(server_name) 
    end 
end 

Como se ve, ambas tareas están bajo el mismo espacio de nombres y ambas tareas utilizan server_name='myserver'constante variable.

Realmente parece feo definir la variable server_name dos veces bajo el mismo espacio de nombres, ¿cómo puedo tener un lugar que defina esta variable para que ambas tareas puedan usarlo?

Respuesta

14

Prueba esto:

namespace :db do 
    server_name='myserver' 
    task :first_task => :environment do 
    connect_to(server_name) 
    end 

    task :second_task => :environment do 
    do_something_with(server_name) 
    end 
end 

espacios de nombres tienen acceso a las variables declaradas antes de su alcance.

6

me gustaría construir sobre David Sulc's answer, pero yo recomiendo usar una variable de instancia en su lugar:

namespace :db do 
    @server_name = 'myserver' 

    task first_task: :environment do 
    connect_to @server_name 
    end 

    task second_task: :environment do 
    do_something_with @server_name 
    end 
end 

La ventaja aquí es que el código más adelante puede modificar @server_name - algo que no se puede hacer con un local variable:

namespace :db do 
    @server_name = 'server_2' 
end 
+0

No, no deberías hacer eso. La razón es que no sabes a dónde va ese ivar. Yo tampoco. Una tarea de rake se declara utilizando un bloque, no una clase, y, por lo tanto, el contexto del ivar no está claro. – meandre

+0

@meandre ¿Cuál es el problema con el uso de una variable de instancia de esta manera? ¿Puedes demostrar dónde podría salir mal? Tienes una mejor sugerencia? Consulte la sección "Variables de instancia en tareas" en http://daneharrigan.com/2010/06/rake-tasks-102/ para una discusión más detallada. –

+0

@meandre En realidad, las variables de instancia definidas en la forma en que muestro se evalúan en el contexto de 'Rake.application.in_namespace (name, & block)' (consulte https://github.com/jimweirich/rake/blob/v10.3.2 /lib/rake/dsl_definition.rb#L140). No estoy seguro de cuál es tu preocupación. –

Cuestiones relacionadas