8

optparse-applicativeバージョン 0.7.0.2を使用しています。

いくつかの必須オプションを使用するパーサーを作成したいと考えていますが、オプションなしで呼び出すと、使用法だけではなく、使用法とヘルプの両方が表示されます (つまり、オプションなしの呼び出しが を使用した呼び出しのように動作するようにしたい--help)。

ドキュメントにそれが可能であると書かれていても、私はそうする方法を理解できません:

この例の hello オプションは必須です (デフォルト値がないため)。したがって、引数なしでプログラムを実行すると、ヘルプ テキストが表示されます。

これの実例はありますか?メインのドキュメントにあるものは私には機能しません (使用法のみを出力します)。

4

3 に答える 3

4

現在、これを行う唯一の方法は、 Options.Applicative.Extra モジュールcustomExecParserから独自のバージョンを作成することです。これを簡単にするための未解決の問題があります。

このようなものは、探しているものにかなり近いはずです。

import Options.Applicative
import Options.Applicative.Help as AH
import Options.Applicative.Types as AT
import System.Environment (getArgs, getProgName)
import System.Exit (exitWith, ExitCode(..))
import System.IO (hPutStr, stderr)

execParserWithHelp :: ParserPrefs -> ParserInfo a -> IO a
execParserWithHelp pprefs pinfo = do
  args <- getArgs
  case execParserPure pprefs pinfo args of
    Right a -> return a
    Left failure -> do
      progn <- getProgName
      msg <- AT.errMessage failure progn
      let extra = if null args
                  then AH.parserHelpText pprefs pinfo
                  else ""
      let c = errExitCode failure
      case c of
        ExitSuccess -> putStr (msg ++ extra)
        _           -> hPutStr stderr (msg ++ extra)
      exitWith c

main :: IO ()
main = execParserWithHelp (prefs idm) opts >>= run

opts :: ParserInfo Command
opts = info (commands <**> helper) idm

run :: Command -> IO ()
run = ...

これは基本的にcustomExecParser、引数が空かどうかをチェックする小さなブロックだけです。そうであれば、パーサーのヘルプが表示されます。

于 2013-11-24T12:45:20.357 に答える
3

プログラムが引数なしで実行された場合を含め、すべてのエラー の--help出力を出力したいだけの場合は、 への呼び出しをで定義されるへの呼び出しに置き換えます。execParsershowHelpOnErrorExecParser

-- | A version of 'execParser' which shows full help on error.                
--                                                                            
-- The regular 'execParser' only prints usage on error, which doesn't         
-- include the options, subcommands, or mention of the help switch            
-- @--help@.                                                                  
showHelpOnErrorExecParser :: ParserInfo a -> IO a
showHelpOnErrorExecParser = customExecParser (prefs showHelpOnError)

受け入れられた回答にリンクされている問題に関するコメントに基づいています。

于 2015-09-30T01:41:00.417 に答える