如何从命令的构建器对象中获取我的选项之一
require('yargs')
.usage('Usage: $0 <cmd> [options]')
.command(
'read',
'Read a note',
{
id: {
demand: true,
string: true
},
first: {
demand: true,
boolean: true
}
},
argv => {
note.read(argv.id).then(data => {
console.log('==================note read==================');
console.log(data);
console.log('==================note read==================');
});
}
)
.help()
.strict().argv;
在这里,我希望用户为id
命令传递first
或read
选项
在使用无效选项运行此命令时,也不会显示错误
node app.js read --id=1 --first=1
yargs: ^12.0.5
答案 0 :(得分:1)
您可以使用check
API。
// code is written for logic purpose. Not tested.
.check(function (argv) {
if ((argv.id && !argv.first) || (!argv.id && argv.first)) {
return true;
} else if (argv.id && argv.first) {
throw(new Error('Error: pass either id or first option for read command'));
} else {
throw(new Error('Error: pass either id or first option for read command'));
}
})
PS:1可以是字符串或布尔值作为选项值
答案 1 :(得分:0)
这是我当前正在使用的解决方案。尽管我正在寻找更好的解决方案。
require('yargs')
.usage('Usage: $0 <cmd> [options]')
.command(
'read',
'Read a note',
yargs =>
yargs
.option('id', {
string: true
})
.option('first', {
boolean: true
})
.check(({ id, first }) => {
if (!id.trim() && !first) {
throw new Error('id or first option is required');
}
return true
}),
argv => {
if (argv.first) {
note.readFirst().then(data => {
console.log('==================note read==================');
console.log(data);
console.log('==================note read==================');
});
} else {
note.read(argv.id).then(data => {
console.log('==================note read==================');
console.log(data);
console.log('==================note read==================');
});
}
}
)
.help()
.strict().argv;
yargs命令有4个选项。命令,描述,生成器和处理程序。 Builder可以是对象或函数。使用功能可用于提供高级命令特定帮助。
我也删除了对它们的需求,因为使用需求会询问两个选项,但我只想要一个。
此外,当将选项设置为字符串或布尔值时,它只会强制转换为该类型,而不会验证该类型。因此,这里如果没有提供任何选项,argv.first
默认值为false
和argv.id
默认值为''
空字符串。
此外,当从check函数中抛出错误时,它实际上会显示Error对象的错误消息,但是如果我们返回false,它将在控制台中将函数主体显示为消息,以帮助跟踪错误。
同样,如果不访问argv
,yargs也将无法解析。
请参见https://yargs.js.org/docs/#api-commandcmd-desc-builder-handler,https://yargs.js.org/docs/#api-argv。
答案 2 :(得分:0)
您可以使用demandOption = true
解决问题