如何使用OptionParser解析rake参数

paw*_*318 8 ruby rake ruby-on-rails rake-task

提供我试图用来解析参数的答案.我从那里简化了示例,我不得不添加两个以使其工作.OptionParserrakeARGV.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
Run Code Online (Sandbox Code Playgroud)

这是输出:

$ rake user:create -- -u foo
ARGV: ["user:create", "--", "-u", "foo"]
ARGV: ["-u", "foo"]
user: foo
Run Code Online (Sandbox Code Playgroud)

我认为ARGV.shift不应该这样做.我想知道为什么没有它以及如何以正确的方式解决它不起作用.

Meh*_*rsi 7

您可以使用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]}"
Run Code Online (Sandbox Code Playgroud)

你可以传递这样的args: $ rake foo:bar -- '--user=john'