commander 用法
安装
代码语言:javascript复制npm i -S commander
创建脚手架实例
代码语言:javascript复制// 方法一 获取 commander 脚手架单例
const { program } = commander;
// 方法二 手动创建新的 commander 实例
const program = new commander.Command();
使用
代码语言:javascript复制program
.name(Object.keys(pkg.bin)[0]) // 设置 usage 的 name
.usage('<command>[options]') // 设置 usage 的 message
.parse(process.argv); // 解析参数
代码语言:javascript复制program
.version(pkg.version) // 设置 Version 命令
.parse(process.argv); // 解析参数
代码语言:javascript复制program
.option('-d, --debug', '是否开启调试模式?', true) // 创建 debug 命令 , 第三个参数:是否默认开启
.option('-e, --envName <envName>', '获取环境变量名称') // 创建 envName 命令
.parse(process.argv); // 解析参数
其他常用 api
可以拿到参数以及默认值
代码语言:javascript复制// 打印出命令的 options
console.log(program.opts());
可以看到没有输入 -h
或者 --help
,依然打印出来帮助信息
// 打印出帮助信息
program.outputHelp();
注册命令
方法一: command
注册命令
const clone = program.command('clone <source> [destination]');
clone
.description('克隆一个仓库')
.option('-f, --force', '是否强制克隆') // 注册 clone 命令下的 option
.action((source, destination, cmdObj) => {
console.log('do clone', source, destination, cmdObj);
});
方法二: addCommand
注册命令
// 创建一个新的命令
const service = new commander.Command('service').description('启动一个服务');
// 添加子命令
service
.command('start [port]')
.description('启动服务')
.action((port) => {
console.log(`服务启动于${port}`);
});
// 添加子命令
service
.command('stop')
.description('停止服务')
.action(() => {
console.log('服务停止了');
});
// 把命令添加到脚手架中
program.addCommand(service);
匹配所有命令
代码语言:javascript复制// 匹配所有不存在的命令
program
.arguments('<cmd> [option]')
.description('友情提示:', {
cmd: '要有一个必须的命令',
option: '有一个可选的参数',
})
.action((cmd, option) => {
console.log(cmd, option);
});
<>
代表必须,[]
代表可选。必须要有一个命令。
-h
的时候会出现提示
脚手架互相调用
将脚手架名称拼上 install
,去执行新的命令,如:test-cli-install
// 执行新的命令,用于脚手架之间互相调用
program
.command('install [name]', 'install package', {
executableFile: 'hzw-cli-dev', // 切换要执行的命令名称
isDefault: true, // 默认执行这个命令
hidden: true, // 隐藏命令
})
.alias('i');
PS:这个不知道为啥和演示的不一样,我执行这个就是去找模块了,有可能是版本的问题。
高级定制 自定义 help 信息
代码语言:javascript复制program.helpInformation = function () {
return '';
};
program.on('--help', function () {
console.log('我是帮助信息');
});
再执行 -h
就不会出现之前的内容了,而是调用我们自定义的方法。
高级定制 实现 debug 模式
注意:在解析参数之后执行,脚手架初始化之前打印 verbose
还是不可以。可以使用这个方法代替之前自己封装的开启 debug
模式的代码。
program.on('option:debug', () => {
console.log('开启debug模式');
if (program._optionValues.debug) {
process.env.LOG_LEVEL = 'verbose';
}
console.log(process.env.LOG_LEVEL);
});
高级定制 对所有未知命令监听
当输入未知命令时,执行自定义的回调。
代码语言:javascript复制program.on('command:*', (obj) => {
const commands = program.commands.map((command) => command.name());
console.log(`可用命令为${commands.join(',')}`);
});