1

我使用optparse-applicative与stackage lts 5.1 我有一个解析器与子命令,我已经描述了他们的选项的帮助文本,但他们不显示。optparse-applicative子命令帮助文本

这是输出当我--help运行可执行文件:

[[email protected] manipro]$ /home/david/.local/bin/manipro --help 
manipro - text1 

Usage: manipro COMMAND [-v|--verbose] text2 

Available options: 
    -h,--help    Show this help text 
    -v,--verbose    text3 

Available commands: 
    export     text4 
    dico      text9 

代码:

parserArgs :: ParserInfo ArgApp 
parserArgs = info (helper <*> args) desc 
    where 
    desc = 
     fullDesc <> 
     progDesc "text1" <> 
     header "text2" 


args = ArgApp <$> argCmd <*> optverbose 
    where 
    optverbose = switch ( 
     short 'v' <> long "verbose" <> 
     help "text3") 

argCmd = subparser (argCmdExport <> argCmdDico) 

argCmdExport = command "export" infos 
    where 
    infos = info options desc 
    desc = progDesc "text4" 
    options = ArgCmdExport <$> 
     argModeExport <*> 
     argTableExport <*> 
     argOptExport 

argModeExport = argument auto (metavar "FORMAT") 
argTableExport = argument text (metavar "TABLE") 

argOptExport = ArgOptExport <$> optional noesc <*> optional cols <*> 
    ens <*> tst 
    where 
    noesc = option textList (long "noesc" <> metavar "CHAMPS" <> help "text5") 
    cols = option textList (long "cols" <> metavar "CHAMPS" <> help "text6") 
    ens = flag EnsEtoile EnsDollar (short 'd' <> long "dollar" <> 
     help "text7") 
    tst = flag False True (short 't' <> long "test" <> 
     help "text8") 

argCmdDico = command "dico" infos 
    where 
    infos = info options desc 
    desc = progDesc "text9" 
    options = ArgCmdDico <$> 
     argOptDico 

argOptDico = ArgOptDico <$> optional tables 
    where 
    tables = option textList (long "tables" <> metavar "TABLES" <> 
     help "text10") 


text = str >>= return . pack 
textList = str >>= return . splitOn "," . pack 
+0

你确实试过' --help',对不对? – Zeta

+0

当然,问题中的输出是正确的。我将编辑,以便更清楚 –

+1

您已经尝试过'manipro --help'。请注意,我询问您是否尝试过'manipro --help',例如, '操作导出 - 帮助'。 – Zeta

回答

1

optparse-applicative隐藏命令的详细说明故意如果你只使用--help。毕竟,你可能有一打命令。例如,stack有34个。列表可能会垂直填充您的终端。如果它显示了所有可能的参数,那么最终会得到很多文本。

而是,--help将只显示常见的参数和命令列表。为了显示单个命令的描述,你必须使用<executable> <command> --help

$ stack --help | head 
stack - The Haskell Tool Stack 

Usage: stack [--help] [--version] [--numeric-version] [--docker*] [--nix*] 
      ([--verbosity VERBOSITY] | [-v|--verbose]) [--work-dir WORK-DIR] 
      [--[no-]system-ghc] [--[no-]install-ghc] [--arch ARCH] [--os OS] 
      [--ghc-variant VARIANT] [-j|--jobs JOBS] [--extra-include-dirs DIR] 
      [--extra-lib-dirs DIR] [--[no-]skip-ghc-check] [--[no-]skip-msys] 
      [--local-bin-path DIR] [--[no-]modify-code-page] 
      [--resolver RESOLVER] [--compiler COMPILER] [--[no-]terminal] 
      [--stack-yaml STACK-YAML] COMMAND|FILE 

$ stack --help | grep clean 
    clean     Clean the local packages 

$ stack clean --help 
Usage: stack clean [PACKAGE] [--help] 
    Clean the local packages 

Available options: 
    PACKAGE     If none specified, clean all local packages 
    --help     Show this help text 

Run 'stack --help' for global options that apply to all subcommands. 

这一定程度上降低了混乱。它也遵循与其他流行的多命令应用程序相同的规则,例如githg(只有<executable> --help <command>仍然只显示一般帮助的小例外)。

2

Zeta指出,单一命令的描述显示在<executable> <command> --help上。但为了达到此目的,在optparse-applicative中,每个命令的子分析器都需要选项--help的解析器。您只为<executable> --help定义了一个(请参阅haskell代码块的第二行)。如果没有针对特定命令的帮助解析器,<executable> <command> --help的输出将不会有任何帮助信息,而是关于invalid option --help和使用说明的通知。

一般模式是依次将解析器的--help选项,即helper应用于解析器,以获取命令的参数,如下所示:command "command-name" (info (yourCommandArgParser <**> helper) (fullDesc <> progDesc "your commands description" <> ...))

所以对于export命令你可以写:

argCmdExport = command "export" infos 
    where 
    infos = info (options <**> helper) desc 
    desc = progDesc "text4" 
    options = ArgCmdExport <$> 
     argModeExport <*> 
     argTableExport <*> 
     argOptExport 

PS。问题很老,但当我遇到同样的问题时,我偶然发现了它。网络上仍然没有任何关于它的信息。