0

コマンド ライン アプリのオプションを解析するためにRuby のoptparseライブラリを使用していますが、コマンドを受け入れる方法がわかりません。

次のようになります。

commit -f -d init

initこの場合のコマンドになります。ユーザーが何も提供していない場合に実行する必要があるデフォルトのコマンドがあるため、常に必要というわけではありません。

これが私が今持っているコードです:

OptionParser.new do |opts|
  opts.banner  = %Q!Usage:
  pivotal_commit                                          # to commit with a currently started issue
  pivotal_commit -f                                       # to commit with a currently started issue and finish it
  pivotal_commit -d                                       # to commit with a currently started issue and deliver it
  pivotal_commit init -e "me@gmail.com" -p my_password -l #to generate a config file at the current directory!

  opts.on("-e", "--email [EMAIL]", String, "The email to the PT account you want to access") do |v|
    options[:email] = v
  end

  opts.on("-p", "--password [PASSWORD]", String, "The password to the PT account you want to access") do |v|
    options[:password] = v
  end

  opts.on("-f", '--finish', 'Finish the story you were currently working on after commit') do |v|
    options[:finish] = v
  end

  opts.on('-d', '--deliver', 'Deliver the story you were currently working on after commit') do |v|
    options[:deliver] = v
  end

  opts.on_tail('-h', '--help', 'Show this message') do
    puts opts
    exit
  end

  opts.on_tail('-v', '--version', 'Show version') do
    puts "pivotal_committer version: #{PivotalCommitter::VERSION}"
    exit
  end

end.parse!
4

1 に答える 1

5

からオプションを抽出するため、コマンドライン引数 (オプションではない) はARGV呼び出しの後にあります。したがって、次のようなサブコマンドを取得できます。OptionParser#parse!#parse!ARGV

options = {}

OptionParser.new do |opts|
# definitions of command-line options...
# ...
end.parse!

subcommand = ARGV.shift || "init"

print "options: "
p options
puts "subcommand: #{subcommand}"

サブコマンドがたくさんある場合は、Thor gem が役立つかもしれません。

また、これはあなたの質問に対する回答ではありませんが、オプション定義の括弧 ([]) は、オプションの引数がオプションであることを意味します。たとえば、定義では、オプションが渡された場合でも、電子メールとパスワードが nil になる場合があります。

$ pivotal_commit -e
options: {:email=>nil}
subcommand: init

オプションが渡されるときに引数が必要な場合は、括弧を削除します。

# ...
  opts.on("-e", "--email EMAIL", String, "The email to the PT account you want to access") do |v|
    options[:email] = v
  end
# ...

電子メールの引数が必要になりました:

$ pivotal_commit -e
pivotal_commit:6:in `<main>': missing argument: -e (OptionParser::MissingArgument)
于 2012-10-17T15:52:49.953 に答える