私は、ツールの CLI コンポーネントのエラー処理を使用して、CLI Ruby ツールをもう少し堅牢にすることに取り組んでいました。私は optparse を使用しています。ドキュメントには、フラグに必須およびオプションの引数を指定できることが示されています。奇妙な/迷惑な動作が見られるだけです。
フラグの引数が (等号を使用して) 必須である 1 つのケースでは、失敗させようとしましたが、それでも機能し、代わりにそのフラグの引数として次のフラグ ('-u') を取得しました。残りの解析が理想的とは言えない方法で barf されます。「-....」が有効な場合があるため、これで問題ないと思いますが、スイッチの値を設定するために等号を使用しているため、「スペース」スタイルの割り当ては機能しないと思います.
op = OptionParser.new do |x|
x.on("-u", "--user=USER", "user flag") do |user| options[:user] = user end
x.on("-d", "--db=DATABASE", "database flag") do |db| options[:db] = db end
end
次の CLI 入力を渡すと:
myprog -u -d mydb positionalarg
次に、解析中に options[:user] を -d に設定し、options[:db] は検出されず、1 ではなく 2 つの位置引数があるため nil です。明らかにこれはユーザー エラーですが、キャッチしたい実際のエラーを表示し、次のリストから位置引数を 1 つだけ渡す必要があるというエラー (ツールの場合) を返すだけではありません: ... 本当の問題は、必要な引数である -u フラグがないことです。したがって、optparse に ArgumentMissing 例外があることを考えると、それが .parse! だと思います。投げます。
ただし、オプションの引数 (等号を使用) を持つフラグを使用すると、-a -b=something を実行すると実際にはオプションになりますが、これは機能しません: -a something -b=somethingelse. 値を強制する唯一の方法は、等号 (-a=something -b=somethingelse) を使用することです。等号付きの必須の引数を使用した以前の動作を考えると、そうではないと思います。例:
op = OptionParser.new do |x|
x.on("-u", "--user[=USER]", "user flag") do |user| options[:user] = user unless user.nil? end
x.on("-d", "--db=DATABASE", "database flag") do |db| options[:db] = db end
end
したがって、解析すると:
myprog -u -d mydb positionalarg
次に、options[:user] は nil (ok) で、options[:db] は mydb で、1 つの位置引数が残っています。
この解析では:
myprog -u myuser -d mydb positionalarg
次に、options[:user] は nil (OK ではありません) で、options[:db] は mydb で、2 つの位置引数が残っています: myuser と positionalarg (OK ではありません)。私のエラーチェックは、再び、位置引数カウントで barfs します。必須のフラグ引数の場合、スペースと = の両方が機能する場合、オプションのフラグ引数の場合は同じであるはずですが、そうではありません。
もう 1 つの問題は、オプションの引数 (スペースを使用) を持つフラグは、それらがコマンドの最後にあり、位置引数をフラグ引数として受け取る場合を除いて問題ないということです。
例:
op = OptionParser.new do |x|
x.on("-u", "--user [USER]", "user flag") do |user| options[:user] = user unless user.nil? end
x.on("-d", "--db=DATABASE", "database flag") do |db| options[:db] = db end
end
したがって、解析すると:
myprog -d mydb -u positionalarg
次に、options[:db] は mydb (ok) で、options[:user] は positionalarg であり、位置引数は残っていません。-d mydb は、等号で指定したスペースでも機能することに注意してください。
多くの人が optparse .parse を実行して ruby CLI を実行しているようです! ARGV の残りのエントリを位置引数として取得しますが、ARGV を optparse に渡す前に、最初に遠端から位置引数を取り除く方がよいと考えています (可変数の位置引数の場合にこれが失敗する場合を除きます)。
私はこれらすべてをプログラミングできると確信していますが、私が知らない optparse でそれを行う方法がある場合は、そうしないことを好みます。
オプションの引数を持つフラグを避けるのが最善かもしれません:)が、アドバイスをいただければ幸いです。