System.CommandLine F# 友好吗?

psf*_*aki 5 f# command-line-interface system.commandline

对于 F# 应用程序,我传统上使用不同的功能友好的命令行解析器,例如ArguCommandLineParser

既然 Microsoft 已经推出了System.CommandLine(可能会带来更好的支持和文档),它可以在 F# 中使用吗?

psf*_*aki 4

功能友好性是主观的,但我发现 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 将来可能会发生重大变化。