Logo
Published on

写一个基于Node的命令行工具

Authors

2019年,NodeJS已经发布10年了,并且它可以做的事情是越来越多,从web后端到爬虫,从客户端应用到操作系统,可以说真是印证了那句:

凡是可以用JavaScript重写的项目必然都会被用JavaScript重写。

而这一切的原因,正是因为NodeJS把JavaScript从浏览器中释放了出来。基于此,我们可以操作I/O、调用系统接口等等。而在现代前端项目中,我们需要各种工具帮助我们更方便地开发,因此出现了npm来方便开发者管理自己的Node包。那么,到底应该如何构建一个自己的基于NodeJS的命令行工具呢?很明显,网上太多类似的文章了,这里就只简单说一下吧。

手动构建

我们只需要简单的三步就可以构建一个最简单的命令行工具:

第一步

在我们的项目根目录中的package.json增加如下代码:

{
  "main": "index.js", // npm init会默认生成这一句
  "bin": {
    "cmd-tool-cli": "./bin/index.js"
  }
}

第二步

在根目录中新增index.js

第三步

在根目录中新增bin/index.js

这样就完成了一个最基础的命令行工具的搭建。其中最重要的就是package.json中增加的bin字段,作用是指明命令行中使用命令时对应的执行文件。还有一点需要注意的是在bin/index.js中的最开始一定要加上

#!/usr/bin/env node

这是用来告诉系统,用node来执行该文件。

项目工程化

作为一个之后要开源的命令行工具,我们的工程必须做好工程化的各个方面的工作。比如eslint校验、babel转义、commit message规范、版本更新规范、git使用等等内容。

光是构建一个项目都会觉得有很多事情要做,而且这些工程化的内容是和项目无关的。所以我们为什么不把它们抽离出来,使用一个工具自动生成呢?

自动构建

cmd-tool-cli

所以,终于可以推荐五个月前写的一个小工具cmd-tool-cli -- 一个用来生成命令行工具的脚手架,可以帮助开发者一键生成一个支持命令行工具开发的目录结构。它生成的结构如下:

├── .eslintignore
├── .eslintrc
├── .gitignore
├── README.md
├── node_modules
├── bin
│   └── index.js
├── commitlint.config.js
├── index.js
├── lib
│   └── index.js
├── package-lock.json
└── package.json

同时自带

1.git初始化

2.npm初始化

3.eslint安装

4.babel转义

5.githook钩子回调的工具husky、仅校验提交的文件内容lint-staged的安装

6.规范版本更新信息的standard-version的安装

7.规范commit message的工具commitlint的安装

8.当然,还有最重要的支持终端对话的工具commander的安装

除了commander,其它的工具都是作为开发依赖安装的。

如何使用

npm i cmd-tool-cli -g
mkdir dir_path
cd dir_path
cmd-tool-cli init

由于当前该工具还处于Beta版,所以仍然有一些功能、性能、甚至是用户体验的问题需要修改。

如果在命令行中输入

cmd-tool-cli -h

可以发现工具提供了如下选项:

  -o, --output [path]  Directory of output
  --no-git             Do not initialize with git
  --no-dep             Do not install any dependency

-o可以指定安装路径

--no-git可以忽略git安装

--no-dep可以忽略所有依赖包的安装

总结

至此,一个自动化生成基于NodeJS命令行工具的脚手架就完成了。点击阅读原文可以看到该工具在github上的源码。如果你有任何的意见和建议,请随时在github上提PR~