我有一个rake任务,需要将一个值插入多个数据库。
我想从命令行或从另一个rake任务中将这个值传递给rake任务。
我该怎么做呢?
我有一个rake任务,需要将一个值插入多个数据库。
我想从命令行或从另一个rake任务中将这个值传递给rake任务。
我该怎么做呢?
当前回答
这里我不明白的一点是如何处理任意参数。如果你传递了任务定义中没有列出的参数,它们仍然可以在args.extras下访问:
task :thing, [:foo] do |task, args|
puts args[:foo] # named argument
puts args.extras # any additional arguments that were passed
end
其他回答
要将参数传递给默认任务,可以这样做。例如,说 "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文件中使用了一个常规的ruby参数:
DB = ARGV[1]
然后我在文件底部去掉rake任务(因为rake将根据参数名查找任务)。
task :database_name1
task :database_name2
命令行:
rake mytask db_name
这感觉比我的var=foo ENV var和任务参数[blah, blah2]解决方案更干净。 存根有点麻烦,但如果您只有几个一次性设置的环境,那也不算太糟
上面描述的大多数方法对我来说都不起作用,也许它们在新版本中已弃用。 最新的指南可以在这里找到:http://guides.rubyonrails.org/command_line.html#custom-rake-tasks
下面是该指南的复制粘贴示例:
task :task_name, [:arg_1] => [:pre_1, :pre_2] do |t, args|
# You can use args from here
end
像这样调用它
bin/rake "task_name[value 1]" # entire argument string should be quoted
如果你想传递命名参数(例如使用标准OptionParser),你可以使用这样的东西:
$ rake user:create -- --user test@example.com --pass 123
注意——,这是绕过标准Rake参数所必需的。应该适用于Rake 0.9。X, <= 10.3.x。
更新的Rake已经改变了对——的解析,现在你必须确保它没有传递给OptionParser#parse方法,例如使用parser.parse!(ARGV[2..-1])
require 'rake'
require 'optparse'
# Rake task for creating an account
namespace :user do |args|
desc 'Creates user account with given credentials: rake user:create'
# environment is required to have access to Rails models
task :create do
options = {}
OptionParser.new(args) do |opts|
opts.banner = "Usage: rake user:create [options]"
opts.on("-u", "--user {username}","User's email address", String) do |user|
options[:user] = user
end
opts.on("-p", "--pass {password}","User's password", String) do |pass|
options[:pass] = pass
end
end.parse!
puts "creating user account..."
u = Hash.new
u[:email] = options[:user]
u[:password] = options[:pass]
# with some DB layer like ActiveRecord:
# user = User.new(u); user.save!
puts "user: " + u.to_s
puts "account created."
exit 0
end
end
exit将确保额外的参数不会被解释为Rake任务。
参数的快捷方式也可以工作:
rake user:create -- -u test@example.com -p 123
当rake脚本看起来像这样时,也许是时候寻找另一种工具来实现这一点了。
这里我不明白的一点是如何处理任意参数。如果你传递了任务定义中没有列出的参数,它们仍然可以在args.extras下访问:
task :thing, [:foo] do |task, args|
puts args[:foo] # named argument
puts args.extras # any additional arguments that were passed
end