Commander.js是一个Node.js的轻量级命令行框架,用于创建命令行应用程序。Commander.js提供了对应用程序命令行告知用户的友好界面,并应用了普遍认同的GNU和Unix标准选项。
Commander官方文档
脚手架的介绍及开发流程
使用usage()
定义用法提示,根据需要使用name()
定义用法提示的前缀,最后使用version()
定义版本号。
const commander = require("commander");
// 获取commander的单例
const { program } = commander;
// 非单例的写法,一般用于注册子命令
// const program = commander.Command()
program
// 用法提示
.usage(" [options]" )
// 用法提示的前缀 ==> imooc-test [options]
.name(Object.keys(pkg.bin)[0])
// 版本号
.version(pkg.version);
使用option()
定义全局选项,可以定义多个全局选项。第一个参数为选项的名称和别名,需要使用空格来分割。第二个参数为该选项的描述信息。第三个参数为选项默认值。
program
.option("-d, --debug", "是否开启调试模式", false)
// -e/--env后跟的字符,将存到envName属性中
.option("-e, --envName " , "获取环境变量名称", 'production');
使用opts()
获取解析命令行参数后的选项键值对,属性名为选项的长标识
const opts = program.opts();
console.log(opts) // => {debug: false, envName: 'production'}
command()
注册命令,<> 表示该参数是必须的。
description()
定义该命令的描述信息。alias()
定义该命令的别名。option()
定义该命令的选项,用法与全局选项一致。action()
定义该命令要做的事情。const clone = program.command("clone );
clone
// 命令描述
.description("command clone")
// 别名
.alias("c")
// 命令的选项
.option("-f --force", "是否强制克隆", false)
// 要做的事
.action((source, cmdObj) => {
// cmdObj-命令行键值对
// mock-项目是否已克隆
const cloned = true;
if (cloned) {
// 强制覆盖
if (cmdObj.force) {
console.log("项目已克隆,将强制覆盖");
handleClone(source)
} else {
console.log("克隆失败!该项目已克隆");
}
} else {
handleClone(source)
}
});
function handleClone(source) {
console.log("cloning...");
console.log(`cloneSource is ${source}`);
console.log("opts:", program.opts());
}
addCommand()
注册子命令program.addCommand()
将该命令加入到主命令中const service = new commander.Command("service");
service
.command("start [port]")
.description("start a new service at some port")
.action((port) => {
console.log("do service start", port);
});
service
.command("stop")
.description("stop service")
.action(() => {
console.log("stop service");
});
program.addCommand(service);
program.arguments()方法用于解析命令行中的参数,若命令行中存在没有被program.command()或Command.command()注册的命令或选项,这些参数会被自动传递到这个默认的回调函数中。
program
// 注册arguments
.arguments(" [options]" )
// arguments的描述信息
.description("test command")
.action((cmd, options) => {
console.log("cmd:", cmd);
console.log("options:", options);
});
使用process.argv
可以获取命令行参数,再使用program.parse()
解析命令行参数(需要放到代码的最后一行)。
program.parse(process.argv);
#!/usr/bin/env node
const commander = require("commander");
const process = require("process");
const pkg = require("../package.json");
// 获取commander的单例
const { program } = commander;
// 非单例的写法:const program = commander.Command()
program
// 用法提示
.usage(" [options]" )
// 用法提示的前缀 ==> imooc-test [options]
.name(Object.keys(pkg.bin)[0])
// 版本号
.version(pkg.version);
/*
* option-定义选项
* flags: string
* description?: string | undefined
* defaultValue?: string | boolean | string[] | undefined
*/
// 这里是注册全局选项
program
.option("-d, --debug", "是否开启调试模式", false)
// -e/--env后跟的字符,将存到envName属性中
.option("-e, --envName " , "获取环境变量名称");
/*
* 注册命令
* 有command和addCommand两种方式
*/
// 方式一:command
// 注册clone命令,返回一个配置对象,<>-必选 []-可选
const clone = program.command("clone );
clone
// 命令描述
.description("command clone")
// 别名
.alias("c")
// 命令的选项
.option("-f --force", "是否强制克隆", false)
// 要做的事
.action((source, cmdObj) => {
// cmdObj-命令行键值对
// 项目是否已克隆
const cloned = true;
if (cloned) {
// 强制覆盖
if (cmdObj.force) {
console.log("项目已克隆,将强制覆盖");
handleClone(source);
} else {
console.log("克隆失败!该项目已克隆");
}
} else {
handleClone(source);
}
});
function handleClone(source) {
console.log("cloning...");
console.log(`cloneSource is ${source}`);
console.log("opts:", program.opts());
}
// 方式二:addCommand,注册子命令
const service = new commander.Command("service");
service
.command("start [port]")
.description("start a new service at some port")
.action((port) => {
console.log("do service start", port);
});
service
.command("stop")
.description("stop service")
.action(() => {
console.log("stop service");
});
program.addCommand(service);
/*
* arguments-没有注册的命令,都会走到这
*/
program
.arguments(" [options]" )
.description("test command")
.action((cmd, options) => {
console.log("cmd:", cmd);
console.log("options:", options);
});
// 提示帮助信息
// program.outputHelp()
// 获取选项键值对
// const optionsMap = program.opts();
// console.log(optionsMap); ==> { version: boolean, envName: string }
// 解析命令行参数
program.parse(process.argv);