2011-12-01 12 views
14

aşağıdaki gibi aynı ad altındaki iki Rake görevleri var: Gördüğünüz gibi,tırmık görev değişkeni

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 

hem görevler aynı ad altındadır ve her iki görevler server_name='myserver'sabit değişken kullanın.

server_name değişkenini aynı ad alanı altında iki kez tanımlamak gerçekten çirkin görünüyor, bu değişkeni tanımlayan bir yer nasıl olabilir, böylece her iki görevde de kullanılabilir mi?

cevap

14

bu deneyin:

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 

Ad kendi kapsamı önce bildirilen değişkenler erişebilir.

6

Ben David Sulc's answer üzerine inşa etmek istiyorum, ama bunun yerine bir örnek değişkeni kullanılmasını öneriyoruz:

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 

Buradaki avantaj daha sonraki kod @server_name değiştirebilir olmasıdır - Bir yerel ile yapamayacağınız bir şeyi değişkeni:

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

Hayır, bunu yapmamalısınız. Sebebi, bilmediğin, ivarın nereye gittiği. Ben de yok. Bir komisyon görevi, sınıf değil, bir blok kullanılarak bildirilir ve bu nedenle ivar'ın içeriği belirsizdir. – meandre

+0

@meandre Bir örnek değişkeni bu şekilde kullanmayla ilgili sorun nedir? Nerede yanlış gidebileceğini gösterebilir misin? Daha iyi bir önerin var mı? Daha ayrıntılı tartışma için http://daneharrigan.com/2010/06/rake-tasks-102/ adresindeki "Görevlerdeki Örnek Değişkenleri" bölümüne bakın. –

+0

@meandre Aslında, gösterdiğim şekilde tanımlanan örnek değişkenler, "Rake.application.in_namespace (name, & block)" bağlamında değerlendirilir (bkz. Https://github.com/jimweirich/rake/blob/v10.3.2 /lib/rake/dsl_definition.rb#L140). Endişenizin ne olduğundan emin değilim. –