如何在未选择命令时创建yargs默认响应
解决Yargs CLI未输入/输入无效命令时显示欢迎信息的问题
核心思路
Yargs默认在无命令或命令不存在时会输出内置帮助信息,要替换成自定义的欢迎/提示内容,需要结合strict、demandCommand或默认命令$0,配合fail方法实现精准场景捕获。
具体实现方案
方案1:统一处理两种场景(无命令+无效命令)
通过fail方法一次性捕获两种情况,逻辑更集中:
const yargs = require('yargs'); const { hideBin } = require('yargs/helpers'); // 定义你的嵌套命令 yargs(hideBin(process.argv)) .command('create [type]', '创建资源', (yargs) => { yargs.command('project', '创建项目', () => { console.log('创建项目中...'); }) .command('file', '创建文件', () => { console.log('创建文件中...'); }); }) .command('delete <id>', '删除资源', () => { console.log('删除资源中...'); }) // 开启严格模式,捕获不存在的命令 .strict() // 要求至少输入1个命令,触发无命令时的错误 .demandCommand(1) // 自定义错误处理逻辑 .fail((msg, err, yargs) => { // 判断错误类型,输出对应提示 if (msg.includes('Missing required command')) { console.log('=== 欢迎使用我的CLI工具 ==='); console.log('可用命令:'); console.log('- create project: 创建项目'); console.log('- create file: 创建文件'); console.log('- delete <id>: 删除资源'); console.log('\n输入 `your-cli --help` 查看详细帮助'); } else if (msg.includes('Unknown command')) { console.log(`❌ 未知命令:${process.argv.slice(2).join(' ')}`); console.log('=== 可用命令 ==='); console.log('- create project: 创建项目'); console.log('- create file: 创建文件'); console.log('- delete <id>: 删除资源'); console.log('\n输入 `your-cli --help` 查看详细帮助'); } else { // 其他错误输出原信息并退出 console.error(msg); process.exit(1); } }) .help() .argv;
方案2:拆分场景处理(默认命令+strict捕获)
用$0默认命令单独处理无命令场景,strict配合fail处理无效命令:
const yargs = require('yargs'); const { hideBin } = require('yargs/helpers'); yargs(hideBin(process.argv)) // 默认命令:用户未输入任何命令时触发 .command('$0', '欢迎信息', () => { console.log('=== 欢迎使用我的CLI工具 ==='); console.log('可用命令:'); console.log('- create project: 创建项目'); console.log('- create file: 创建文件'); console.log('- delete <id>: 删除资源'); console.log('\n输入 `your-cli --help` 查看详细帮助'); }) // 定义嵌套命令 .command('create [type]', '创建资源', (yargs) => { yargs.command('project', '创建项目', () => { console.log('创建项目中...'); }) .command('file', '创建文件', () => { console.log('创建文件中...'); }); }) .command('delete <id>', '删除资源', () => { console.log('删除资源中...'); }) // 开启严格模式,捕获无效命令 .strict() // 处理无效命令的错误 .fail((msg, err, yargs) => { if (msg.includes('Unknown command')) { console.log(`❌ 未知命令:${process.argv.slice(2).join(' ')}`); console.log('=== 可用命令 ==='); console.log('- create project: 创建项目'); console.log('- create file: 创建文件'); console.log('- delete <id>: 删除资源'); console.log('\n输入 `your-cli --help` 查看详细帮助'); } else { console.error(msg); process.exit(1); } }) .help() .argv;
关键说明
strict():开启后Yargs会对不存在的命令抛出错误,方便我们捕获处理。demandCommand(1):强制要求用户输入至少1个命令,否则触发错误进入fail逻辑。fail():自定义错误处理入口,根据错误信息判断当前场景,输出对应提示。$0命令:Yargs的默认命令标识符,当用户未输入任何子命令时自动触发该命令的处理函数。
内容的提问来源于stack exchange,提问作者APW
相关产品推荐
相关产品推荐

