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不应该这样做.我想知道为什么没有它以及如何以正确的方式解决它不起作用.
您可以使用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'