编写一个自己的Node CLI 命令行工具
前言
CLI,全称是command-line interface
,也就是命令行交互接口。无论是在前端还是后端,都可以用于在构建时通过命令快速生成项目或模板等。Node.js作为最热的开发工具之一,如何用它来开发命令行程序,是一个web开发者应该学习掌握的。
那么如何构建属于自己的CLI工具呢,在项目开发时可以快速生成自己需要的代码模板,去除重复工作,并且还可以为其他的开发者提供快速入门的使用呢?本文教程详细地讲解了这些步骤,让你一步一步搭建出一个属于自己的CLI工具。
准备工作
- 注册并NPM账号,并在本地登录,可以参考这篇文章从零开始编写一个NPM插件并发布
npm adduser yourusername
npm whoami
- 编写你的模板文件,并上传至Github
- 编写入口文件
package.json
"bin": {
"huxinmin": "./bin/huxinmin.js"
}
工具
- commander
node.js命令行接口的完全解决方案,受启发于Ruby的commander。 - git-clone
git-clone是一个很轻量的Node编写的git clone封装,可以很便捷很快速地从github上克隆执行项目模板。也就是说,我们将项目模板静态存储在github上,每当执行cli命令时,将其下载,这样我们就很轻松地得到了项目代码模板。另外,当需要改变项目模板代码时,只需要修改github上的项目代码就可以,cli工具无需修改 - shelljs
shelljs同样是一个很轻量的Node编写的系统命令封装,可以很便捷很快速地在Node代码中使用系统命令。在本例中,因为从github上下载的项目代码会带有.git文件,需要使用rm命令将其删除 - tracer
一个强大高度自定义化的打印输出库 - chalk
终端文字输出颜色样式自定义库 - co-prompt
传统的命令行只能单行一次性地输入所有参数和选项,使用这个工具可以自动提供提示信息,并且分步接收用户的输入,体验类似npm init时的一步一步输入参数的过程 - progress
渲染 ACSII 进度条
构建
如下是huxinmin.js
的代码:
#!/usr/bin/env node
var clone = require('git-clone')
var program = require('commander')
var shell = require('shelljs');
var log = require('tracer').colorConsole()
program
.version('1.0.0')
.description('我的第一个nodejs cli模板生成器')
program
.command('* <project>')
.action(function(project) {
log.info('使用例子:createMyFirstNodeCliTemplate myproject')
if (project) {
let pwd = shell.pwd()
log.info(`正在拉取模板代码,下载位置:${pwd}/${project}/ ...`)
clone(`https://github.com/huxinmin/createMyFirstNodeCliTemplate.git`, pwd + `/${project}`, null, function() {
shell.rm('-rf', pwd + `/${project}/.git`)
log.info('模板工程建立完成')
})
} else {
log.error('正确命令例子:createMyFirstNodeCliTemplate myproject')
}
})
program.parse(process.argv)
如果想要不安装直接使用的话,可以输入
npm link
脚本解释程序:
#! /usr/bin/env node
在代码的开头第一行,必须指定我们的脚本执行所需要的解释程序。在这里,我们使用node来作为脚本的解释程序。而我们#! /usr/bin/env node
这样写,目的是使用env来找到node,并使用node来作为程序的解释程序。
发布并使用
使用NPM发布
npm publish
如果发布失败,可能是因为设置了镜像源,只要设置回去就好了:
npm config set registry https://registry.npmjs.org/
安装
npm install createMyFirstNodeCliTemplate -g
使用
createMyFirstNodeCliTemplate myproject