2011-12-01 7 views
14

Ho due compiti Rake sotto lo stesso namespace come seguire:rastrello variabile compito

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 

Come si vede, entrambe le attività sono sotto il stesso spazio dei nomi ed entrambi i compiti utilizzano server_name='myserver'variabile costante.

E 'davvero brutto definire due volte la variabile server_name sotto lo stesso spazio dei nomi, come posso avere un posto che definisce questa variabile in modo che entrambe le attività possano usarlo?

risposta

14

Prova questo:

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 

namespace hanno accesso alle variabili dichiarate prima del loro campo di applicazione.

6

mi piacerebbe costruire su David Sulc's answer, ma mi consiglia di utilizzare una variabile di istanza, invece:

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 

Il vantaggio è che il codice in seguito può modificare @server_name - qualcosa che non si può fare con un locale variabile:

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

No, non dovresti farlo. Il motivo è che non sai, dove va a finire quell'avar. Nemmeno io. Un rake è dichiarato usando un blocco, non una classe, e quindi il contesto di Ivar non è chiaro. – meandre

+0

@meandre Qual è il problema con l'utilizzo di una variabile di istanza in questo modo? Puoi dimostrare dove potrebbe andare storto? Hai un suggerimento migliore? Vedi la sezione "Variabili di istanza nelle attività" in http://daneharrigan.com/2010/06/rake-tasks-102/ per una discussione più dettagliata. –

+0

@meandre In realtà, le variabili di istanza definite nel modo in cui mostro vengono valutate nel contesto di 'Rake.application.in_namespace (name, & block)' (consultare https://github.com/jimweirich/rake/blob/v10.3.2 /lib/rake/dsl_definition.rb#L140). Non sono sicuro di quale sia la tua preoccupazione. –