简介
npm 包 command-files 是一个帮助开发者构建可维护的命令行应用程序的工具。使用该工具可以快速创建命令行应用程序,并且易于维护和扩展。
同时,command-files 也是一个非常有用的工具,可以让开发者在开发过程中更加专注于代码的实现,而不需要关注命令行交互方面的细节。
使用篇
安装
在开始使用 command-files 之前,需要先安装该工具。可以在命令行中使用以下命令进行安装:
npm install command-files --save-dev
创建命令
一般来说,我们需要通过编写代码来创建自己的命令行程序。
-- -------------------- ---- ------- ----- - ------- - - --------------------- ------------------------- ------- ---------------- ------------------ ----- -- - ----------- ------------ ------- -------- -- ------- ------ ------- ------------ -------- -------- -- ------- -------- ---- ------------- ------------- -------- -- - ----------------- ----- -- --------- -- ------------- - -------------------- ------ -------- - -- -------------- - -------------------- -------- ---- -------------- - --- ----------------------------
上述代码中,我们使用了 commander 包来构建命令行应用程序,其中包含一个名为 list 的子命令。
在该子命令中,我们通过 option 方法来定义了两个选项,-a 和 -l。
接着,在 action 方法中编写实际的代码逻辑,来处理这些选项。
运行命令
要运行我们创建的命令行程序,只需要在终端中输入以下命令即可:
node index.js list ~/Desktop -al
深入篇
接下来,我们将深入 command-files 的源码,来进一步了解其实现原理。
文件结构
在深入了解 command-files 实现原理之前,我们先来看一下其文件组织结构。
-- -------------------- ---- ------- ---- ------------------ -- ----- ------------ -- ------------- ---- -------------------- -- ----- -------------- -- ------ ----- -------- -- ---- ------------------ -------------- ------------ --------------- -- ---- ---------------------- ------------------ -- ------
核心模块-程序类Program
程序类 program 被设计成一个单例模式,负责创建命令行程序,并且存储解析器所解析的参数。
程序类 program 内部使用了标记模式来定义命令和选项。标记模式是一种将一组参数解析为一个包含多个命令和选项的对象的方式。
-- -------------------- ---- ------- --------- ----------------- - ----- ------- ------ ------- ------- ------- --------- ------------------- -------- --------------- - --------- ---------------- - ----- ------- ------ ------- ------- ------- -------------- -------- - ----- ------- - ------- ------------------- ------------------- - --- ------- -------- ------------------ - --- ------- --------- ------- -------- ---------------- - --- ------- ----- -------- - --- -- ---------- ------------- ------- ------ -------- -------------- -------------- ------- ------ ------- -------------- --------- ------------- -- ------- ----------- ---------- ----- -- ---- ------ -------------- -
命令的定义
定义一个需要通过命令行执行的命令,需要调用 program 的 command 方法。
interface CommandHelper { alias(alias: string): CommandHelper; description(desc: string): CommandHelper; action(handler: CommandHandler): void; option(name: string, desc?: string, defaultValue?: unknown): OptionHelper; }
在 command 方法的基础上,我们还可以调用 alias 和 description 方法,来定义该命令的别名和说明。
同时,我们还可以定义该命令所支持的选项,通过调用 option 方法来实现。
解析器的实现
command-files 中的解析器使用了 argv-parser 库来解析命令行参数。
class ArgvParser { public static parse(argv: string[], options: OptionDefinition[]): ParsedArgv { const parser = new ArgvParser(argv, options); return parser.parse(); } }
解析器内部包含两个方法,parse() 和 parseArgv()。
其中,parse() 方法接收命令行参数,调用 parseArgv() 方法来解析参数。parseArgv() 方法根据命令行参数的不同,解析出对应的命令和选项,并将它们保存在 program 对象的 commands 和 options 属性中。
命令的加载
command-files 会自动加载当前目录下的所有以 .cmd.ts 或 .cmd.js 结尾的文件作为命令。
load-commands.ts 中定义了 loadCommands 方法,该方法会加载所有匹配规则的文件,并将它们作为命令来注册。还可以给这些文件定义缺省值。
-- -------------------- ---- ------- ----- ------------ - ------ ----- ------------- -------- ----- --- - --- ---- - ----------- ----------- - --- - ----- ----- - ----- ------------ - ---- ---- --------- ----- --- -------------------- ------- -- - ----- -------- - --------- ------ ----- ------- - -------------------------------------- ---- ----- --- - ------------------ -- ------- ----------- --- -------- -- ----------------- - ----------------------------- ------- ------- ---- --------- -- ------- ---- --- ---- - ----- ------- ------ ---- ------- --- --- ------------- ------- - ------------------------ ------------------------------------ -- -- - ----------------------------------------- ---------- --- ---------------------------- ----- -------------- - -
load 方法将依赖注入 program 以便 command 方法在其中定义命令。
总结
command-files 提供了一个简单而又强大的工具,可帮助开发者快速创建和扩展 CLI 工具。该工具的拓展和维护都非常容易,帮助开发者聚焦于代码实现,提高开发效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6005596081e8991b448d6cd2