如何在NodeJS中开发一个命令行界面CLI工具

17次阅读

共计 2029 个字符,预计需要花费 6 分钟才能阅读完成。

借助 Heroku 的 Oclif 框架作为开发人员,我们经常会用到 CLI 工具。从 git 到 cloud shells,我们处处都在使用这些工具。所以,是时候开发一个自己的了。在此过程中,我们将使用 Heroku 的强大的 oclif 框架。

Oclif 是什么?
它是一个快速构建 CLI 工具的开放框架,由著名的 Heroku 提供。

要建什么?
我们将创建一个待办事项指令,它有四个操作:

1、添加新任
2、查看所有任务
3、更新任务
4、删除一个任务

初始化项目
Oclif 可以生成两种类型的项目
1、具有一个命令的项目。
2、可能有多个命令(包括嵌套命令) 的项目。

在本文中,我们需要一个多命令项目,所以让我们生成它:

npx oclif multi todocli
运行此项指令并按照说明操作,将在当前目录中初始化一个名为 todocli 的新项目。

现在,让我们进入目录并运行帮助:

cd todocli && ./bin/run --help
这将给出如下结果:

> USAGE   
    $ todocli [COMMAND]
  COMMANDS
    hello   
    help   display help for todocli

可用的指令及其文档将会被展示。

项目安排
在 src 目录中,我们可以找到一个名为 commands 的目录。这个目录包含所有指令及其相对文件名。打个比方,如果我们有一个 hello 指令,那么这个目录中有一个名为 hello.js 的文件,并且该指令将在无需任何设置的情况下运行。让我们删除 hello.js,因为我们不需要它了。

设置数据库

为了存储我们的任务,我们需要一个存储系统。为了简单起见,我们将使用 lowdb,这是一个非常简单的 json 文件存储系统。

然后我们来安装它吧:

npm install lowdb --save

让我们在项目根目录中创建一个 db.json 的文件。这个文件将保存我们的数据。然后我们需要安装 lowdb。现在,我们将在 src 目录中创建一个名为 db.js 的文件。这个文件将保存数据库的内容。

在此,我们只是先加载所需的库和文件,然后将一个空的 todos 阵列定义为基本集合(如果是 SQL 数据库的话,那么它就是一个表格)。

添加任务
Oclif 为我们提供了流畅的指令生成功能。让我们运行以下代码:

oclif command add
这将在 src/commands 目录中创建一个名为 add.js 的文件。让我们用下面的代码替换该文件的内容:

该文件有几个关键组件:

一个运行函数, 执行此命令的主要功能的,
一项描述,这是指令的文件分类,
还有标志,它描述传递给指令的标志。

这里,我们有一个名为 task 的标志,它具有 string 类型。我们可以运行这个命令

./bin/run add --task="welcome task"
该指令将向数据库添加一个任务,并登载该操作的响应。

显示任务

在 show.js 中,我们以升序显示所有任务。我们在 chalkjs 中添加了一些颜色,以便更好地查看命令结果。

更新任务

为了简单起见,我们现在只是将更新部分的任务设置为 done。我们只需要将任务的 id 当成 flag。

./bin/run update --id=1
这会在这个任务里设置 done = true 以及 id = 1。

删除任务

删除非常简单:我们将 id 作为标志传递,然后从数据库中删除相关任务。

快好了
就像这样,我们做了一个非常简单的 todocli。现在,如果我们想像其他标准的 CLI 工具一样使用它,或者让我们的朋友使用它,我们需要使它成为一个 npm 包。我们要把它发布在 npm 上。

完成开发并发布到 npm
首先,我们要有一个 npm 帐户。然后,我们需要登录运行指令。
npm login
然后在项目目录下运行

npm run prepack
这将打包该项目,并使其具备从描述和标志生成的自述文件并准备好发布。

现在,在 npm 上发布:

npm publish
如果一切顺利,那么该模块已成功发布在 npm 上。如果不能成功,请检查项目名称和版本。

我们可以开始使用它,像任何其他 npm 工具一样并支持全球安装:

npm install -g todocli
任何人都可以随时随地使用这些指令????

> todocli add --task="Great task!!!"
> todocli show
> todocli update --id=1
> todocli remove --id=1

如果您来到这里已经看完了整篇文章, 恭喜???? 你真棒!
现在,你可以做一个小任务.
任务
分配任务的 id 是不正确,你可以修改吗? 在回答部分告诉我你是怎么解的。

oclif : https://oclif.io
lowdb: https://github.com/typicode/l…
chalk: https://github.com/chalk/chalk
todocli: https://www.npmjs.com/package…

今天的分享就到这里,希望本文能帮助到您!

点赞,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)
关注公众号「新前端社区」,享受文章首发体验!
每周重点攻克一个前端技术难点。

正文完
 0