我正在使用yargs“build”、“link”、“clean”等子命令创建一个构建工具。
我希望能够./build.js不带参数地键入并调用“build”子命令处理程序作为默认值。
我能够这样做:
var argv = yargs
.usage("I am usage.")
.command('bundle', 'Create JS bundles', bundle)
.command('link', 'Symlink JS files that do not need bundling', link)
.command('clean', 'Remove build artifacts', clean)
.command('build', 'Perform entire build process.', build)
.help('help')
.argv;
if (argv._.length === 0) { build(); }
Run Code Online (Sandbox Code Playgroud)
但对我来说这似乎有点老套,如果我想向“build”子命令添加任何其他位置参数,它可能会导致问题。
有没有办法在 yargs 的语义内完成这个任务?文档.command()可能会更清楚。
如何从命令中要求生成器对象中的选项之一
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;
Run Code Online (Sandbox Code Playgroud)
在这里我希望用户传递命令的id或first选项read
此外,当使用无效选项运行此命令时,它不会显示错误
node app.js read --id=1 --first=1
Run Code Online (Sandbox Code Playgroud)
yargs: ^12.0.5
我正在使用 node.js 和 yargs 编写一些代码示例,并且尝试访问 yargs.command 和 yargs.version,我可以使用 require 轻松访问它们。
但是当我将 import 与该行一起使用时:
import * as yargs from 'yargs';
它返回一个错误,指出 * 是无效令牌
如何才能成功迁移导入?
给出以下脚本:
const yargs = require('yargs');
const argv =
yargs
.usage('Usage: $0 [--whatIf]')
.alias('d', 'directory')
.alias('wi', 'whatIf')
.nargs('d', 1)
.describe('d', 'alphabetize this directory')
.describe('whatIf', 'show what would happen if run')
.demandOption(['d'])
.argv;
console.log(argv.directory);
Run Code Online (Sandbox Code Playgroud)
如果我像这样从 Windows PowerShell 调用脚本: 我会得到我期望的node .\alphabetizer.js -d 'l:\my folder\Files - Some Files In Here\' --whatIf输出。对于不需要转义的文件夹名称,它可以正常工作,但似乎会因转义而感到困惑。l:\my folder\Files - Some Files In Here\" --whatIfl:\my folder\Files - Some Files In Here\
如果我检查process.argv,我可以看到相同的转义问题。
我注意到,如果删除尾部斜杠,它就会起作用。然而,这仍然表明节点脚本没有正确处理输入,因为对于用单引号引起来的字符串来说这不是必需的。
有办法让这项工作发挥作用吗?
亚格斯示例:
require('yargs')
.scriptName("pirate-parser")
.usage('$0 <cmd> [args]')
.command('hello [name]', 'welcome ter yargs!', (yargs) => {
yargs.positional('name', {
type: 'string',
default: 'Cambi',
describe: 'the name to say hello to'
})
}, function (argv) {
console.log('hello', argv.name, 'welcome to yargs!')
})
.help()
.argv
Run Code Online (Sandbox Code Playgroud)
我该如何在 ESM 中执行此操作?
提前致谢
我正在使用yargs来验证用于数据加载助手库的cli参数。
我希望能够在允许运行脚本之前检查文件是否存在,对此我可以这样做fs.accessSync(filename, fs.R_OK);。但是,如果文件不存在,则消息传递只是将.check()函数显示为错误,而我要拦截,并声明该文件不存在(具有读取权限)。
那么,如何在错误返回时发送由.check()呈现的错误?
这是我的观点的要点:
var path = {
name: 'filepath',
options: {
alias: 'f',
describe: 'provide json array file',
demand: true,
},
};
function fileExists(filename) {
try {
fs.accessSync(filename, fs.R_OK);
return true;
} catch (e) {
return false;
}
}
var argv = require('yargs')
.usage('$0 [args]')
.option(path.name, path.options)
.check(function (argv) {
return fileExists(argv.f);
})
.strict()
.help('help')
.argv;
Run Code Online (Sandbox Code Playgroud)
以及返回的错误(如果不是可读文件):
Argument check failed: function (argv) {
return fileExists(argv.f);
}
Run Code Online (Sandbox Code Playgroud)
我希望能够按照以下方式指定一些内容:
Argument check failed: filepath is not a …
我正在构建一个需要将单个文件作为参数传递的 Node CLI 应用程序。
例如:
myapp.js /Users/jdoe/my_file.txt
Run Code Online (Sandbox Code Playgroud)
我知道我可以/Users/jdoe/my_file.txt通过_yargs 中的对象进行引用,但是我如何要求提供它?我看到了demandOption()方法,但我不知道如何要求没有相应标志(名称)的选项。
我尝试了以下方法但它不起作用:
.demandOption('_', "A file path is required")
Run Code Online (Sandbox Code Playgroud) 我目前有 yargs 在一个应用程序中工作,该应用程序可以在没有参数的情况下运行,或者以下两者之一:
- 一个只有一个参数的“-o”选项
- 不带参数的“-f”选项
这些工作,但没有什么能阻止用户输入被忽略的额外选项或参数,例如:
- 应用程序你好
- app -f 你好
- app -o 你好你好
我宁愿失败并提醒他们使用。我认为 .check() 函数是正确的方法,但我在网上找不到很多例子。任何人都可以建议一个 check() 函数,如果这是正确的方法吗?