如何使用OptionParser解析rake参数
我正在尝试使用OptionParser
来解析rake
参数。 我从那里简化了示例,我不得不添加两个ARGV.shift
以使其工作。
require 'optparse' namespace :user do |args| # Fix I hate to have here puts "ARGV: #{ARGV}" ARGV.shift ARGV.shift puts "ARGV: #{ARGV}" desc 'Creates user account with given credentials: rake user:create' # environment is required to have access to Rails models task :create => :environment do options = {} OptionParser.new(args) do |opts| opts.banner = "Usage: rake user:create [options]" opts.on("-u", "--user {username}","Username") { |user| options[:user] = user } end.parse! puts "user: #{options[:user]}" exit 0 end end
这是输出:
$ rake user:create -- -u foo ARGV: ["user:create", "--", "-u", "foo"] ARGV: ["-u", "foo"] user: foo
我认为ARGV.shift
不是它应该做的方式。 我想知道为什么没有它以及如何以正确的方式解决它是不行的。
您可以使用OptionParser#order!
方法OptionParser#order!
返回没有错误参数的ARGV:
options = {} o = OptionParser.new o.banner = "Usage: rake user:create [options]" o.on("-u NAME", "--user NAME") { |username| options[:user] = username } args = o.order!(ARGV) {} o.parse!(args) puts "user: #{options[:user]}"
你可以传递这样的args: $ rake foo:bar -- '--user=john'
我知道这并没有严格回答你的问题,但你是否考虑过使用任务参数?
那将免除你必须摆弄OptionParser
和ARGV
:
namespace :user do |args| desc 'Creates user account with given credentials: rake user:create' task :create, [:username] => :environment do |t, args| # when called with rake user:create[foo], # args is now {username: 'foo'} and you can access it with args[:username] end end
有关详细信息,请参阅此处的答案 。
你必须在-u
和foo
之间放一个’=’:
$ rake user:create -- -u=foo
代替:
$ rake user:create -- -u foo