psf*_*aki 5 f# command-line-interface system.commandline
对于 F# 应用程序,我传统上使用不同的功能友好的命令行解析器,例如Argu和CommandLineParser。
既然 Microsoft 已经推出了System.CommandLine(可能会带来更好的支持和文档),它可以在 F# 中使用吗?
功能友好性是主观的,但我发现 API 对于 F# 来说相当方便:
open System.CommandLine
open System.CommandLine.Invocation
[<EntryPoint>]
let main argv =
let option1 = Option<string> "--option1"
let option2 = Option<string> "--option2"
let option3 = Option<string> "--option3"
let option4 = Option<string> "--option4"
let command1 = Command "command 1"
command1.AddOption option1
command1.AddOption option2
command1.Handler <- CommandHandler.Create (fun option1 option2 -> Operation1.run option1 option2)
let command2 = Command "command 2"
command2.AddOption option3
command2.AddOption option4
command2.Handler <- CommandHandler.Create (fun option3 option4 -> Operation1.run option3 option4)
let rootCommand = RootCommand "My tool."
rootCommand.AddCommand command1
rootCommand.AddCommand command2
rootCommand.Invoke argv
Run Code Online (Sandbox Code Playgroud)
为了使代码更有趣,一些简单的助手可以提供帮助:
open System.CommandLine
let addCommand subCommand (command: Command) =
command.AddCommand subCommand
command
let addOption option (command: Command) =
command.AddOption option
command
let setHandler handler (command: Command) =
command.Handler <- handler
command
Run Code Online (Sandbox Code Playgroud)
使用方式如下:
open System.CommandLine
open System.CommandLine.Invocation
[<EntryPoint>]
let main argv =
let option1 = Option<string> "--option1"
let option2 = Option<string> "--option2"
let option3 = Option<string> "--option3"
let option4 = Option<string> "--option4"
let command1 =
Command "command 1"
|> addOption option1
|> addOption option2
|> setHandler (CommandHandler.Create (fun option1 option2 -> Operation1.run option1 option2))
let command2 =
Command "command 2"
|> addOption option3
|> addOption option4
|> setHandler (CommandHandler.Create (fun option3 option4 -> Operation2.run option3 option4))
let rootCommand =
RootCommand "My tool."
|> addCommand command1
|> addCommand command2
rootCommand.Invoke argv
Run Code Online (Sandbox Code Playgroud)
这似乎也是一个以 F# 方式拥有的专用库。System.CommandLine
在库设计过程中可能考虑到了 F#,尽管有一些注意事项,例如命令处理程序绑定的注意事项。
一般来说,该库仍处于预览阶段,因此 API 将来可能会发生重大变化。