我有一个rake任务,需要将一个值插入多个数据库。
我想从命令行或从另一个rake任务中将这个值传递给rake任务。
我该怎么做呢?
我有一个rake任务,需要将一个值插入多个数据库。
我想从命令行或从另一个rake任务中将这个值传递给rake任务。
我该怎么做呢?
当前回答
我不知道如何传递args和:environment,直到我解决了这个问题:
namespace :db do
desc 'Export product data'
task :export, [:file_token, :file_path] => :environment do |t, args|
args.with_defaults(:file_token => "products", :file_path => "./lib/data/")
#do stuff [...]
end
end
然后我这样调用:
rake db:export['foo, /tmp/']
其他回答
desc 'an updated version'
task :task_name, [:arg1, :arg2] => [:dependency1, :dependency2] do |t, args|
puts args[:arg1]
end
我在这两个网站上找到了答案:Net Maniac和Aimred。
您需要拥有版本> 0.8的rake才能使用这种技术
正常的rake任务描述如下:
desc 'Task Description'
task :task_name => [:depends_on_taskA, :depends_on_taskB] do
#interesting things
end
要传递参数,需要做三件事:
在任务名称之后添加参数名称,以逗号分隔。 将依赖项放在最后,使用:needs =>[…] 把|t, args|放在do后面。(t为本次任务的对象)
要访问脚本中的参数,请使用args.arg_name
desc 'Takes arguments task'
task :task_name, :display_value, :display_times, :needs => [:depends_on_taskA, :depends_on_taskB] do |t, args|
args.display_times.to_i.times do
puts args.display_value
end
end
要从命令行调用此任务,请将[]s中的参数传递给它
rake task_name['Hello',4]
将输出
Hello
Hello
Hello
Hello
如果你想从另一个任务调用这个任务,并给它传递参数,使用invoke
task :caller do
puts 'In Caller'
Rake::Task[:task_name].invoke('hi',2)
end
然后命令
rake caller
将输出
In Caller
hi
hi
我还没有找到一种方法来传递参数作为依赖的一部分,如下代码中断:
task :caller => :task_name['hi',2]' do
puts 'In Caller'
end
namespace :namespace1 do
task :task1, [:arg1, :arg2, :arg3] => :environment do |_t, args|
p args[:arg1]
end
end
调用
rake namespace1: task1(“1”、“2”、“3”)
不需要在调用时提供环境
在ZSH中需要附上引号
rake namespace1: task1(“1”、“2”、“3”)”
除了kch的回答(我不知道如何留下评论,对不起):
在rake命令之前,您不必将变量指定为ENV变量。你可以像设置命令行参数一样设置它们:
rake mytask var=foo
然后从rake文件中访问这些ENV变量,就像这样:
p ENV['var'] # => "foo"
在传递参数时,更好的选择是输入文件,这可以是excel, json或任何你需要的,从那里读取数据结构和你需要的变量,包括变量名,因为是需要的。 读取文件可以有以下结构。
namespace :name_sapace_task do
desc "Description task...."
task :name_task => :environment do
data = ActiveSupport::JSON.decode(File.read(Rails.root+"public/file.json")) if defined?(data)
# and work whit yoour data, example is data["user_id"]
end
end
示例json
{
"name_task": "I'm a task",
"user_id": 389,
"users_assigned": [389,672,524],
"task_id": 3
}
执行
rake :name_task