2015-01-23 10 views
6

Reffering that answer Stavo cercando di utilizzare OptionParser per analizzare gli argomenti rake. Ho semplificato l'esempio da lì e ho dovuto aggiungere due ARGV.shift per farlo funzionare.Come analizzare gli argomenti di rake con 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 

Questa è l'uscita:

$ rake user:create -- -u foo 
ARGV: ["user:create", "--", "-u", "foo"] 
ARGV: ["-u", "foo"] 
user: foo 

Presumo ARGV.shift non è il modo in cui dovrebbe essere fatto. Mi piacerebbe sapere perché non funziona senza di esso e come risolverlo in modo corretto.

risposta

5

È possibile utilizzare il metodo OptionParser#order! che restituisce ARGV senza gli argomenti sbagliati:

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]}" 

è possibile passare args così: $ rake foo:bar -- '--user=john'

-1

devi mettere un '=' fra -u e foo:

$ rake user:create -- -u=foo

Invece di:

$ rake user:create -- -u foo

+0

Con 'ARGV.shift' funzionare con o senza' = '. Sfortunatamente senza 'ARGV.shift' non funziona ogni volta che uso' = 'oppure no. – pawel7318

+1

La domanda è come analizzare argomenti generali in Rake, invece di come passare argomenti in rails 'Rake. –

3

So che questo non strettamente rispondere alla tua domanda, ma ha fatto consideri l'utilizzo degli argomenti delle attività?

che avrebbe liberato voi dover armeggiare con OptionParser e 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 

Per ulteriori informazioni, vedere this answer here on SO.

0

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

un esempio chiarificatore:

alther tips Gist

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

+1

Benvenuti in Stack Overflow. Si prega di controllare [risposta] per suggerimenti su come dare le risposte migliori. Ad esempio, sarebbe utile se mostrassi il codice più pertinente nella tua risposta e qualche contesto per i link nel caso in cui non siano disponibili quando i futuri utenti arrivano con domande simili. – Kateract

Problemi correlati