RAKE元编程:如何从列表创建多个任务 [英] Rake metaprogramming: How to create multiple tasks from list

查看:19
本文介绍了RAKE元编程:如何从列表创建多个任务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

实际上我想要的是Capstrano脚本(它是基于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被用作任务定义中某个环境设置的键。

如何以这种方式定义多个任务?

推荐答案

如何:

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包含的名称。

这篇关于RAKE元编程:如何从列表创建多个任务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆