实际上我想要一个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
被用作任务定义中环境设置的关键。
如何以这种方式定义多个任务?
答案 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
包含的任务。