2015-01-23 2 views
6

Reffering that answer Я пытался использовать OptionParser для разбора rake аргументов. Я упростил пример оттуда, и мне пришлось добавить два ARGV.shift, чтобы они работали.Как разобрать аргументы рейка с помощью OptionParser

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 не так, как это должно быть сделано. Я хотел бы знать, почему он не работает без него и как правильно его исправить.

ответ

5

Вы можете использовать метод 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]}" 

Вы можете пройти арг так: $ rake foo:bar -- '--user=john'

-1

Вы должны положить '=' между -u и foo:

$ rake user:create -- -u=foo

Вместо:

$ rake user:create -- -u foo

+0

С 'ARGV.shift' он работает с или без' = '. К сожалению, без 'ARGV.shift' он не работает, когда я использую' = 'или нет. – pawel7318

+1

Вопрос заключается в том, как разбирать общие аргументы в Rake, а не как передавать аргументы в rails rails. –

3

Я знаю, это не строго ответить на ваш вопрос, но сделал вы рассматриваете использование аргументов задачи?

Это освободит вас от необходимости возиться с 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 

Для получения дополнительной информации см this answer here on SO.

0

<script src="https://gist.github.com/altherlex/bb67f17cb8eefb281866fc21dfeb921a.js"></script>

уточняющий пример:

alther tips Gist

https://gist.github.com/altherlex/bb67f17cb8eefb281866fc21dfeb921a

+1

Добро пожаловать в переполнение стека. Пожалуйста, проверьте [ответ] за советы по предоставлению наилучших ответов. Например, было бы полезно, если бы вы показали наиболее подходящий код в своем ответе и некоторый контекст для ссылок в случае, если они недоступны, когда будущие пользователи приходят с подобными вопросами. – Kateract

Смежные вопросы