2016-02-02 28 views
1

其實我想要一個Capistrano腳本(這是基於Rake的)。Rake元編程:如何從列表中創建多個任務

如何轉換幾個任務是這樣的:

desc 'Runs rake db:seed' 
task :seed do 
    on roles :db do 
    within release_path do 
     with rails_env: fetch(:rails_env) do 
     execute :rake, "db:seed" 
     end 
    end 
    end 
end 

弄成這個樣子:

task_list = %i(
    db:seed 
    db:reset 
    db:migrate 
    db:seed:testusers 
    db:seed:testorders 
) 

task_list.each do |task_name| 
    desc %(Runs rake #{task_name}) 
    task :task_name do 
    on roles :db do 
     within release_path do 
     with rails_env: fetch(:rails_env) do 
      execute :rake, task_name 
     end 
     end 
    end 
    end 

end 

我的問題是,該task_name被用作一個環境中設置的關鍵任務定義。

如何以這種方式定義多個任務?

+1

你想'task task_name',而不是'task:task_name'。前者將創建一個名稱爲變量「task_name」的值的任務。後者將創建一個名爲':task_name'的任務。 –

回答

3

如何:

task_list = %i(
    db:seed 
    db:reset 
    db:migrate 
    db:seed:testusers 
    db:seed:testorders 
) 

task_list.each do |task_name| 
    desc %(Runs rake #{task_name}) 
    task {task_name => [:set_rails_env]} do 
    on primary fetch(:migration_role) do 
     within release_path do 
     with rails_env: fetch(:rails_env) do 
      execute :rake, task_name 
     end 
     end 
    end 
    end 
end 

編輯:看到你從task_name: [:dependency]更改簽名以簡單的task_name,你就必須做到:

task_list.each do |task_name| 
    desc %(Runs rake #{task_name}) 
    task task_name do 
    ... 
    end 
end 

原因上面是task_name: :foo:task_name => :foo的語法糖。由於您希望動態評估您的密鑰,因此可以將散列更改爲task_name => :foo,其中task_name是一個包含符號的變量。

換句話說 - 你不希望你的任務被直接調用task_name - 你想調用你的變量task_name

+0

感謝您的超快速響應:)在一個塊中包裝任務名稱似乎很有趣。其實看到這一點,我意識到我必須定義它ruby2風格的塊。名稱'{:name => val}'必須改爲'{name:val}'。 –

+0

對不起,但我必須更改問題語法。這實際上可以讓你的回覆更容易,更準確。 –

+1

它們不是塊,它們是散列。儘管Ruby實際上是完全不同的構造,但Ruby對兩者都使用大括號。它有助於知道'foo :: bar'等價於':foo =>:bar'。 – troelskn

相關問題