我对 optparse-applicative 有两个问题:(我将这些问题放在一起,因为很可能存在一个潜在的误解)。
据说用法是:(COMMAND | COMMAND)
犯罪 cli - 处理犯罪模板并部署命令
用法:(COMMAND | COMMAND) CRIME 的 CLI
我希望它实际列出程序的名称(非交互式)并列出命令,但我不知道如何为特定的子命令添加元数据。
- 当我尝试获取特定子命令的帮助时,我收到有关缺少必需参数的消息。(
stack exec 命令行-exe -- DeployStack --help
> Invalid option `--help'
>
> Usage: <interactive> DeployStack (-d|--deployment DEPLOYMENT)
> (-t|--template TEMPLATE)
> [-p|--provider PROVIDER] Deploy a Stack
以下是我构建帮助的方式:
-- For information about how this was done see: https://stackoverflow.com/questions/36339103/using-optparse-applicative-with-multiple-subcommands-and-global-options
-- and https://hackage.haskell.org/package/optparse-applicative
module CLIParser
( Actions(..)
, actions
) where
import Data.Semigroup ((<>))
import Options.Applicative
import Text.Show.Functions
data Actions
= CreateTemplate
{ name :: String
, path :: String
}
| DeployStack
{ deployment :: String
, template :: String
, provider :: String
}
deriving (Show)
actions :: Parser Actions
actions =
subparser
(command
"CreateTemplate"
(info templateCreator (progDesc "Create Template")) <>
commandGroup "Template commands:") <|>
subparser
(command "DeployStack" (info deployStack (progDesc "Deploy a Stack")) <>
commandGroup "Deploy commands:")
templateCreator :: Parser Actions
templateCreator = CreateTemplate <$> nameArg <*> pathArg
deployStack :: Parser Actions
deployStack = DeployStack <$> deployArg <*> templateArg <*> providerArg
nameArg :: Parser String
nameArg =
strOption
(long "name" <> metavar "NAME" <> short 'n' <> help "Name to give template")
pathArg :: Parser String
pathArg =
strOption
(long "path" <> metavar "PATH" <> short 'p' <> help "Path to template file")
deployArg :: Parser String
deployArg =
strOption
(long "deployment" <>
metavar "DEPLOYMENT" <> short 'd' <> help "Name of deployment")
templateArg :: Parser String
templateArg =
strOption
(long "template" <>
metavar "TEMPLATE" <> short 't' <> help "Template for deployement")
providerArg :: Parser String
providerArg =
strOption
(long "provider" <>
metavar "PROVIDER" <>
short 'p' <> showDefault <> value "AWS" <> help "Cloud Provider (e.g. AWS)")
** Main.hs **
module Main where
import CLIParser
import Options.Applicative
import System.IO
options :: ParserInfo Actions
options = info (actions <**> helper)
( fullDesc
<> progDesc "The CLI for CRIME"
<> header "crime cli - process CRIME template and deploy commands" )
main :: IO ()
main = execParser options >>= display
display :: Show a => a -> IO ()
display x = print x