惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
爱范儿
爱范儿
Engineering at Meta
Engineering at Meta
J
Java Code Geeks
雷峰网
雷峰网
WordPress大学
WordPress大学
L
LangChain Blog
D
DataBreaches.Net
The GitHub Blog
The GitHub Blog
博客园 - 三生石上(FineUI控件)
Microsoft Security Blog
Microsoft Security Blog
P
Proofpoint News Feed
腾讯CDC
GbyAI
GbyAI
罗磊的独立博客
Blog — PlanetScale
Blog — PlanetScale
月光博客
月光博客
F
Fortinet All Blogs
Y
Y Combinator Blog
V
V2EX
A
About on SuperTechFans

Ray's Blog

从 GitHub Discussions 自动生成静态评论区 — Ray's Blog 给 2025 年的告别 — Ray's Blog Ray's Blog 可重用的工作流 — Ray's Blog Ray's Blog 把博客用 Nuxt Content 重写及踩坑记录 — Ray's Blog Ray's Blog 你这个级别的 Devtools 无权哈我 — Ray's Blog 辞旧迎新:Ray 的 2024 年终总结 — Ray's Blog Ray's Blog 使用 ip6tables 在群晖 DiskStation 上开启 Docker Bridge 网络 IPV6 支持(不支持 SA6400) — Ray's Blog Ray's Blog 迟来了一个月的 2023 年度总结 + 2024 新年快乐! — Ray's Blog Vue Language Tools 深度解析 (1):Vue 编辑器插件发展历程及基本工作原理 — Ray's Blog Ray's Blog Ray's Blog TypeScript 小寄巧!如何在不使用 const 泛型修饰符的情况下推导出列表字面量? — Ray's Blog Ray's Blog 快使用 Dprint 换掉你的 Prettier 罢(迫切 — Ray's Blog Ray's Blog chi 的小红包冒险 v.e.r. 2023 — Ray's Blog Ray's Blog 打造一个强大的 PowerShell 终端 =) — Ray's Blog Ray's Blog 2023 新年快乐! + 年度总结 — Ray's Blog Ray's Blog Ray's Blog 无服务器动态博客系统 Dolan:从设想到现实 — Ray's Blog Ray's Blog 使用 Scoop + 版本管理器科学地管理你的开发环境! — Ray's Blog
Clerc:一个轻量但强大的命令行框架 — Ray's Blog
2022-12-21 · via Ray's Blog

正文

TODO

Clerc 项目地址:https://github.com/so1ve/clerc

感觉 Clerc 写的很牛逼啊,啥功能都有(大嘘

功能列表:

  • 插件化
  • 高度可定制
  • 高度解耦,功能大部分可通过插件实现
  • 链式 API
  • 子命令 + 嵌套命令
  • 可切换的单命令 / 多命令模式
  • 自动映射参数
  • 强类型参数、Flag
  • 把 Flag 转换为驼峰命名
  • 通过 plugin-help 实现自动生成的帮助
  • 通过 plugin-completions 实现自动补全
  • 通过 plugin-not-found 实现在命令未找到的时候给出最接近的命令(即 Did you mean
  • 通过 plugin-version 实现输出版本的命令,及传入 --version-V(可自定义)时输出版本号
  • 通过 plugin-strict-flags 实现在传入多余 / 未定义参数时报错
  • 通过 plugin-friendly-error 实现错误自动美化输出
  • 以及强大的 toolkit(也就是重新导出了一下几个好用的 CLI 工具(bushi
  • 等等等等……

安装

$ npm install clerc -S$ yarn add clerc$ pnpm add clerc

使用

下面是一个最简单的命令:

import { Clerc } from "clerc";const cli = Clerc.create()  .name("foo-cli")  .description("A simple cli")  .version("1.0.0")  .command("foo", "A foo command")  .on("foo", (ctx) => {    console.log(ctx);  })  .parse();

这么几行代码它做了些什么事呢(?)让我们来分析下罢

Clerc.create():没啥好说的,字面意义,创建一个新的 Clerc 实例

cli.name()cli.description()cli.version():也都是字面意思,分别设置 CLI 的名称,描述和版本。注意这三个方法是必须调用的,否则会报错=v=

cli.command():这个方法说是 Clerc 中最重要的方法也不为过,它负责注册命令。它接受 1~3 个参数。

  • 2~3 个参数形式:cli.command(name, description, options?)。其中 options 的类型为:
interface CommandOptions {  alias?: string | string[];  parameters?: string[];  flags?: Record<string, FlagOptions>;  examples?: [string, string][];  notes?: string[];}

alias为一个字符串或一个字符串列表,即该命令的别名

parameters为一个字符串列表,即该命令的参数,格式为<foo>(必选参数),[foo](可选参数),<foo...>(必选展开参数)或[foo...](可选展开参数)。注意可选参数必须在必选参数后,展开参数必须在非展开参数后

flags为命令接受的 Flag,一个对象。这个东西我们之后再说

examples为该命令的示例,为一个字符串双层数组,每个元素的格式为[命令示范, 描述]

notes为该命令的一些提示。

  • 单个参数形式:cli.command(commandObject)。这里的 commandObject 的类型就是上面提到的 options 类型再加上namedescription两个字段,以及一个handler字段(下面会讲)。为什么要添加一个这么奇怪的形式来注册命令呢?有时你不想把命令都写在一个文件里,这样子可以方便地注册命令。

cli.on(name, handler):当某命令被触发时调用 handler。handler 的签名为(ctx) => void。其中 ctx

算了之后再写,好烦