快速实现一个commander脚手架
通过commander库实现;
lerna add commander@6.2.1
在cli-test项目中学习commander库;在mj-cli-test/bin/index.js文件中修改;
#!/usr/bin/env node
const commander = require("commander");
const pkg = require("../package.json");
// 能获取到program,说明脚手架已经注册好了
const { program } = commander;
program.version(pkg.version).parse(process.argv);
这样就可以成功获取version;
commander脚手架全局配置
#!/usr/bin/env node
const commander = require("commander");
const pkg = require("../package.json");
// 获取commander的单例
// 能获取到program,说明脚手架已经注册好了
// const { program } = commander;
// 手动实例化一个Command实例
const program = new commander.Command();
program
.name(Object.keys(pkg.bin)[0])
.usage("<command>[options]")
.version(pkg.version)
.option("-d, --debug", "是否开启调试模式", true)
.option("-e, --envName <envName>", "获取环境变量名称")
.parse(process.argv);
console.log(program.debug);
console.log(program.envName);
program.outputHelp(); // 打印帮助信息
console.log(program.opts()); // 打印所有的参数
commander脚手架命令注册的两种方法
// 1. commander api注册命令
// clone是返回的新对象,<source>是必传参数,[description]是非必传
const clone = program.command("clone <source> [description]");
clone
.description(" clone a repository")
.option("-f, --force", "是否强制拷贝")
.action((source, description, cmdOjb) => {
console.log("clone", source, description, cmdOjb.force);
});
// 2. addCommand 注册命令
// 类似于命令分组
const service = new commander.Command("service");
service
.command("start [port]")
.description("start service by port")
.action((port) => {
console.log("do service start", port);
});
service
.command("stop")
.description("stop service")
.action(() => {
console.log("stop service");
});
program.addCommand(service);
commander注册命令的两种高级用法
// 可以匹配到所有的未注册的命令
program
.arguments("<cmd> [options]")
.description("test command", {
cmd: "command to run",
options: "options for command",
})
.action(function (cmd, options) {
console.log(cmd, options);
});
// 输入 mj-cli-test install test 会去找mj-cli-test-install这个命令
// alias别名
// command的第三个参数opt
// 使用executableFile时,输入mj-cli-test install test,它回去找mj-install
// 可以实现串行调用
// 设置isDefault,默认命中install这个命令
// hidden可以隐藏command
program
.command("install [name]", "install package", {
executableFile: "mj-install",
isDefault: true,
hidden: true,
})
.alias("i");
commander的三种高级用法
// 1.自定义help信息
program.helpInformation = function () {
return "your help infomation";
};
program.on("--help", function () {
console.log("your help infomation");
});
// 2.实现debug模式
program.on("option:debug", function () {
if (program.debug) {
process.env.LOG_LEVEL = "verbose";
}
console.log(process.env.LOG_LEVEL);
});
// 3.对未知命令监听
program.on("command:*", function (obj) {
console.log("obj", obj);
console.error("未知的命令:" + obj[0]);
// console.log(program.commands); // 获取所有的命令
const avaliableCommands = program.commands.map((cmd) => cmd.name());
console.log("可用命令:", avaliableCommands);
});