2011-12-01 124 views
14

我有同樣的命名空間下的兩個Rake任務類似以下內容:rake任務變量

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 

正如你看到的,任務是同一個命名空間之下,這兩個任務使用server_name='myserver'常變量

在相同的命名空間下定義server_name變量真的看起來很醜陋,我怎麼能有一個地方定義這個變量,這樣兩個任務都可以使用它?

回答

14

試試這個:

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 

命名空間訪問他們的範圍之前聲明的變量。

6

我想建立在David Sulc's answer,但我建議使用一個實例變量來代替:

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 

這裏的好處是,以後的代碼可以修改@server_name - 東西,你不能用本地做變量:

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

不,你不應該那樣做。原因是你不知道,伊娃在哪裏。我也沒有。一個耙子任務是用一個塊來聲明的,而不是一個類,因此伊娃的背景是不清楚的。 – meandre

+0

@meandre以這種方式使用實例變量有什麼問題?你能證明它可能出錯的地方嗎?你有更好的建議嗎?有關更詳細的討論,請參閱http://daneharrigan.com/2010/06/rake-tasks-102/中的「任務中的實例變量」部分。 –

+0

@meandre實際上,以我顯示的方式定義的實例變量會在'Rake.application.in_namespace(name,&block)'的上下文中進行評估(請參閱https://github.com/jimweirich/rake/blob/v10.3.2 /lib/rake/dsl_definition.rb#L140)。我不確定你的擔心是什麼。 –