haskell - 使用 optparse 应用程序的子命令帮助
问题描述
我对 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
解决方案
获取 USAGE (COMMAND | COMMAND) 的解决方案是在命令子组中使用元变量。
要获得每个命令的帮助,请使用 hsubcommand 而不是命令。
解决方案如下图:
D:\CRIME\commandLine>stack exec crimeCLI -- --help
crime cli - process CRIME template and deploy commands
Usage: crimeCLI.EXE (Template COMMAND | Deployment COMMAND)
(e.g. stack exec crimeCLI -- TemplateCreate -name NAME -path PATHS)
Available options:
-h,--help Show this help text
Template commands:
TemplateCreate Create Template
TemplateDetails Show Details about a Template
TemplateList List all Templates for this user
Deploy commands:
DeployStack Deploy a Stack to a Provider
DeployRemove Remove a deployed stack from a Provider
这是代码:
-- 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
= TemplateCreate
{ name :: String
, path :: String
}
| TemplateDelete
{ name :: String
, path :: String
}
| TemplateDetails
{ name :: String
}
| TemplateList
| DeployStack
{ deployment :: String
, template :: String
, provider :: String
}
| DeployRemove
{ deployment :: String
, template :: String
, provider :: String
}
deriving (Show)
actions :: Parser Actions
actions =
hsubparser
(command
"TemplateCreate"
(info templateCreator (progDesc "Create Template")) <>
command
"TemplateDetails"
(info templateDetails (progDesc "Show Details about a Template")) <>
command
"TemplateList"
(info templateList (progDesc "List all Templates for this user")) <>
commandGroup "Template commands:" <> (metavar "Template COMMAND")) <|>
hsubparser
(command
"DeployStack"
(info deployStack (progDesc "Deploy a Stack to a Provider")) <>
command
"DeployRemove"
(info deployRemove (progDesc "Remove a deployed stack from a Provider")) <>
commandGroup "Deploy commands:" <> (metavar "Deployment COMMAND"))
templateCreator :: Parser Actions
templateCreator = TemplateCreate <$> nameArg <*> pathArg
templateDetails :: Parser Actions
templateDetails = TemplateDetails <$> nameArg
templateList :: Parser Actions
templateList = pure TemplateList
deployStack :: Parser Actions
deployStack = DeployStack <$> deployArg <*> templateArg <*> providerArg
deployRemove :: Parser Actions
deployRemove = DeployRemove <$> 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)")
推荐阅读
- jquery - 如何使数据过滤器属性值变量?
- vba - 没有类名或 ID 的网络抓取数据
- kotlin - 在 Kotlin 中可以为空?
- neo4j - 对 GraphQL 的 Svelte 订阅
- javascript - 在 React 中的功能组件内创建对外部类组件的引用
- asp.net-core - 尝试在 ASP.NET Core 3.1 中通过 google 进行身份验证时出错没有注册身份验证处理程序
- html - 将 Bootstrap 列重新缩放为与另一列相同的高度?
- swiftui - 如何创建选择器以便除了文本之外我还可以显示 uiImage .png
- docker - 无法安装 Docker DTR
- deno - 在 deno 中,我可以知道我的脚本是直接运行还是被另一个脚本加载?