如何使用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'

我知道这并没有严格回答你的问题,但你是否考虑过使用任务参数?

那将免除你必须摆弄OptionParserARGV

 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 

有关详细信息,请参阅此处的答案 。

  

你必须在-ufoo之间放一个’=’:

$ rake user:create -- -u=foo

代替:

$ rake user:create -- -u foo