开发自己的 cli
常用的库
- commander:命令行接口的完整解决方案,设置一些 node 命令,如 help、usage、version、parse 输入的参数
- ora:终端旋转器,loading 小圈圈。
- chalk:node 终端样式库,可以修改 console 的输出颜色。
安装 chalk 时一定要注意安装 4.x 版本(小包使用的是 4.0.0),否则会因为版本过高,爆出错误。
- inquirer: 用户与命令行之间的交互问答工具。
- rimraf:删除文件和文件夹。
- download-git-repo:git 代码下载库,存到本地
初始化
bash
npm init -y
npm init -y
packge.json 添加 bin 的命令
json
{
"name": "cli-demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"bin": {
"CLI": "./bin/cli"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
{
"name": "cli-demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"bin": {
"CLI": "./bin/cli"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
代码部分
/bin/cli
js
#!/usr/bin/env node
//第一行其中#!/usr/bin/env node表示用node解析器执行本文件。
const program = require("commander");
const pkg = require("../package");
const chalk = require("chalk");
const download = require("download-git-repo");
const ora = require("ora");
const spinner = ora("Loading undead unicorns");
/**
* version
*/
program.version(chalk.green(`${pkg.version}`));
/**
* init 项目
*/
program
.command("init <app-name>")
.description(
"generate a project from a remote template (legacy API, requires ./wk-init)"
)
.option("-c, --clone", "Use git clone when fetching remote template")
.action((appName, opts, cmd) => {
spinner.start("开始下载");
download(
"direct:https://github.com/vue-admin/vue-admin.git#main",
appName,
{ clone: true },
(err) => {
if (err) {
spinner.fail(chalk.green("下载失败 \n" + err));
process.exit();
}
spinner.succeed(chalk.green(`下载成功`));
}
);
});
program.parse(process.argv);
#!/usr/bin/env node
//第一行其中#!/usr/bin/env node表示用node解析器执行本文件。
const program = require("commander");
const pkg = require("../package");
const chalk = require("chalk");
const download = require("download-git-repo");
const ora = require("ora");
const spinner = ora("Loading undead unicorns");
/**
* version
*/
program.version(chalk.green(`${pkg.version}`));
/**
* init 项目
*/
program
.command("init <app-name>")
.description(
"generate a project from a remote template (legacy API, requires ./wk-init)"
)
.option("-c, --clone", "Use git clone when fetching remote template")
.action((appName, opts, cmd) => {
spinner.start("开始下载");
download(
"direct:https://github.com/vue-admin/vue-admin.git#main",
appName,
{ clone: true },
(err) => {
if (err) {
spinner.fail(chalk.green("下载失败 \n" + err));
process.exit();
}
spinner.succeed(chalk.green(`下载成功`));
}
);
});
program.parse(process.argv);
测试
bash
// 添加软连接
npm link
CLI init <app-name>
// 添加软连接
npm link
CLI init <app-name>
发布到 npm
bash
npm login
npm publish
npm login
npm publish