前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >安利一款非常好用的命令行参数库:McMaster.Extensions.CommandLineUtils

安利一款非常好用的命令行参数库:McMaster.Extensions.CommandLineUtils

作者头像
walterlv
发布2018-09-18 13:48:10
1.4K0
发布2018-09-18 13:48:10
举报

安利一款非常好用的命令行参数库:McMaster.Extensions.CommandLineUtils

发布于 2017-10-21 01:44 更新于 2018-04-26 12:39

命令行参数解析想必是每一个命令行程序都难以避开的工程。这工程可小可大,但每次都写始终是在浪费时间。而且,不同人实现也千差万别,使得不同的命令行程序命令参数传入的体验总有差异。

于是安利一款命令行工具库——McMaster.Extensions.CommandLineUtils,它符合当下各大主流命令行工具的参数体验;而且,代码非常简洁。


更新

如果你之前阅读过我这篇博客,可能知道我之前推荐的是 Microsoft.Extensions.CommandlineUtils,是微软出品;不过微软官方已经在 GitHub 上将此命令行项目重定向到了 aspnet/Common,原有的单独的命令行不复存在。

McMaster.Extensions.CommandLineUtils 是微软官方指定的命令行仓库的正统 Folk 版本。

它的仓库和 NuGet 包:


体验超级简洁的代码吧!

我正在自己的项目中采用这款库,项目名为 mdmeta,用于自动生成 Markdown 前的元数据标签,写博客非常方便。

项目地址:walterlv/markdown-metadata: Markdown Metadata (also called mdmeta) is a tool to generate and manage the front matter metadata. It is a cross-platform console app based on .Net Core 2.0.

体验主流的命令行参数体验
代码语言:javascript
复制
# 不带任何参数
mdmeta
代码语言:javascript
复制
# 一个简单的命令
mdmeta echo
代码语言:javascript
复制
# 一个带参数(Argument)的简单的命令
mdmeta echo "Hello!"
代码语言:javascript
复制
# 一个带选项(Option)的简单命令
mdmeta echo --upper
代码语言:javascript
复制
# 一个带参数(Argument)带选项(Option)且选项中带值的简单命令
mdmeta echo "Hello!" -s ", "
代码语言:javascript
复制
# 一个带参数(Argument)带多种选项(Option)且部分选项中带多个值的简单命令
mdmeta echo "Hello!" --repeat-count=3 -s ", " -s "| "
体验库的 Builder API

McMaster.Extensions.CommandLineUtils 使用 Builder API 配出以上的命令,代码非常简洁。

代码语言:javascript
复制
static int Main(string[] args)
{
    var app = new CommandLineApplication{Name = "mdmeta"};
    app.HelpOption("-?|-h|--help");
    app.OnExecute(() =>
    {
        app.ShowHelp();
        return 0;
    });
    app.Command("echo", command =>
    {
        command.Description = "输出用户输入的文字。";
        command.HelpOption("-?|-h|-help");
        var wordsArgument = command.Argument("[words]", "指定需要输出的文字。");
        var repeatOption = command.Option("-r|--repeat-count", "指定输出重复次数", CommandOptionType.SingleValue);
        var upperOption = command.Option("--upper", "指定是否全部大写", CommandOptionType.NoValue);
        var separatorOption = command.Option("-s|--separator", "指定重复输出用户文字时重复之间应该使用的分隔符,可以指定多个,这将依次应用到每一次分割。", CommandOptionType.MultipleValue);
        command.OnExecute(() =>
        {
            // 在这里使用上面各种 Argument 和 Option 的 Value 或 Values 属性拿值。
            return 0;
        });
    });
    return app.Execute(new []{"-?"});
}
体验我封装的命令行参数配置

原生库配置命令行参数已经非常方便了,几乎是一行一个功能,但 lambda 表达式嵌套太多是一个问题,会导致代码随着参数种类的增多变得急剧膨胀;于是我针对原生库做了一个基于反射的版本。于是,实现一个命令行参数只需要写这些代码就够啦:

更新McMaster.Extensions.CommandLineUtils 接手微软之后,也添加了 Attribute 的 API,使用方法与下面的大同小异。

代码语言:javascript
复制
[CommandMetadata("echo", Description = "Output users command at specified format.")]
public sealed class SampleTask : CommandTask
{
    private int _repeatCount;

    [CommandArgument("[words]", Description = "The words the user wants to output.")]
    public string Words { get; set; }

    [CommandOption("-r|--repeat-count", Description = "Indicates how many times to output the users words.")]
    public string RepeatCountRaw
    {
        get => _repeatCount.ToString();
        set => _repeatCount = value == null ? 1 : int.Parse(value);
    }
    
    [CommandOption("--upper", Description = "Indicates that whether all words should be in upper case.")]
    public bool UpperCase { get; set; }

    [CommandOption("-s|--separator", Description = "Specify a string to split each repeat.")]
    public List<string> Separators { get; set; }

    public override int Run()
    {
        // 当用户敲入的命令已准备好,上面的参数准备好,那么这个函数就会在这里执行啦。
        return 0;
    }
}

你一定会吐槽代码变多了。确实如此!但是,当命令的种类和参数的种类变得急剧膨胀的时候,这种方式可以将各种命令都隔离开来。于是,你只需要专注于实现自己的命令就好啦!

将以下这些文件放入自己的项目中即可立刻写出上面的代码(注意 Main 函数也是需要的,因为它启动了反射):

如果发现这一行的后面不是代码,那么极有可能是被不小心屏蔽了,请手动访问:gitee.com/codes

支持的平台

支持 .Net Standard 1.3,这意味着 .Net Core 可以使用,.NET Framework 4.5.1 及以上即可使用。这意味着可以很随意地跨全平台。


参考资料

本文会经常更新,请阅读原文: https://walterlv.com/post/mcmaster-extensions-commandlineutils.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (walter.lv@qq.com)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-10-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安利一款非常好用的命令行参数库:McMaster.Extensions.CommandLineUtils
    • 体验超级简洁的代码吧!
      • 支持的平台
      相关产品与服务
      命令行工具
      腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档