Rake元编程:如何从列表中创建多个任务

时间:2016-02-02 14:37:40

标签: ruby rake capistrano metaprogramming

实际上我想要一个Capistrano脚本(基于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 个答案:

答案 0 :(得分: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包含的任务。