我有一个rake任务,需要将一个值插入多个数据库。
我想从命令行或从另一个rake任务中将这个值传递给rake任务。
我该怎么做呢?
我有一个rake任务,需要将一个值插入多个数据库。
我想从命令行或从另一个rake任务中将这个值传递给rake任务。
我该怎么做呢?
当前回答
在传递参数时,更好的选择是输入文件,这可以是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
其他回答
我在rake文件中使用了一个常规的ruby参数:
DB = ARGV[1]
然后我在文件底部去掉rake任务(因为rake将根据参数名查找任务)。
task :database_name1
task :database_name2
命令行:
rake mytask db_name
这感觉比我的var=foo ENV var和任务参数[blah, blah2]解决方案更干净。 存根有点麻烦,但如果您只有几个一次性设置的环境,那也不算太糟
另一个常用的选项是传递环境变量。在你的代码中,你可以通过ENV['VAR']读取它们,并且可以在rake命令之前传递它们,比如
$ VAR=foo rake mytask
在传递参数时,更好的选择是输入文件,这可以是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
要将参数传递给默认任务,可以这样做。例如,说 "version"是你的论点:
task :default, [:version] => [:build]
task :build, :version do |t,args|
version = args[:version]
puts version ? "version is #{version}" : "no version passed"
end
然后你可以这样调用它:
$ rake
no version passed
or
$ rake default[3.2.1]
version is 3.2.1
or
$ rake build[3.2.1]
version is 3.2.1
但是,我还没有找到一种方法来避免在传递参数时指定任务名称(默认或构建)。如果有人知道办法,我很乐意听听。
我只是想能够奔跑:
$ rake some:task arg1 arg2
简单,是吧?(不!)
Rake将arg1和arg2解释为任务,并尝试运行它们。所以我们要赶在它之前中止。
namespace :some do
task task: :environment do
arg1, arg2 = ARGV
# your task...
exit
end
end
听着,括号!
免责声明:我希望能够在一个相当小的宠物项目中做到这一点。不打算用于“真实世界”,因为您失去了链耙任务的能力(即耙task1 task2 task3)。我觉得不值得。只需使用丑陋的rake任务[arg1,arg2]。