详解基于node.js的脚手架工具开发经历

2020-06-17 06:38:37易采站长站整理

使用commander.js开发命令行工具

nodejs内置了对命令行操作的支持,node工程下

package.json
中的
bin
字段可以定义命令名和关联的执行文件。


{
"name": "macaw-cli",
"version": "1.0.0",
"description": "我的cli",
"bin": {
"macaw": "./bin/macaw.js"
}
}

经过这样配置的nodejs项目,在使用

-g
选项进行全局安装的时候,会自动在系统的
[prefix]/bin
目录下创建相应的符号链接(symlink)关联到执行文件。如果是本地安装,这个符号链接会生成在
./node_modules/.bin
目录下。这样做的好处是可以直接在终端中像执行命令一样执行nodejs文件。关于
prefix
,可以通过
npm config get prefix
获取。

hello, commander.js

在bin目录下创建一个macaw.js文件,用于处理命令行的逻辑。


touch ./bin/macaw.js

接下来就要用到github上一位神级人物——tj ——开发的模块commander.js 。commander.js可以自动的解析命令和参数,合并多选项,处理短参,等等,功能强大,上手简单。具体的使用方法可以参见项目的README。

macaw.js
中编写命令行的入口逻辑


#!/usr/bin/env node

const program = require('commander') // npm i commander -D

program.version('1.0.0')
.usage('<command> [项目名称]')
.command('hello', 'hello')
.parse(process.argv)

接着,在

bin
目录下创建
macaw-hello.js
,放一个打印语句


touch ./bin/macaw-hello.js
echo "console.log('hello, commander')" > ./bin/macaw-hello.js

这样,通过node命令测试一下


node ./bin/macaw.js hello

不出意外,可以在终端上看到一句话:hello, commander。

commander支持git风格的子命令处理 ,可以根据子命令自动引导到以特定格式命名的命令执行文件,文件名的格式是

[command]-[subcommand]
,例如:

macaw hello => macaw-hello
macaw init => macaw-init

定义init子命令

我们需要通过一个命令来新建项目,按照常用的一些名词,我们可以定义一个名为

init