zoukankan      html  css  js  c++  java
  • Node 命令行工具 commander.js 快速上手

    完整的 node.js 命令行解决方案。

    tj/commander.js: node.js command-line interfaces made easy

    中文文档

    1 只使用 option

    这个是最简单和好理解的,直接使用看官方的例子即可:

    commander.js/options-common.js at master · tj/commander.js

    program
      .option('-d, --debug', 'output extra debugging')
      .option('-s, --small', 'small pizza size')
      .option('-p, --pizza-type <type>', 'flavour of pizza');
    

    如果没有指定参数,则 option 默认是 boolean 类型,默认为 undefined,指定了就是 true。

    以下演示中,默认使用如下代码模板,并且主命令假设为 foo

    const { Command } = require("commander");
    const program = new Command();
    
    // code,这里是不同的演示代码
    
    program.parse();
    

    2 使用 argument

    这里是命令的参数,调用形式上和 command 有点像,但是不同的东西。

    program
      .version("0.1.0")
      .argument("<username>", "user to login")
      .argument("[password]", "password for user, if required", "no password given")
      .description("example program for argument")
      .action((username, password) => {
        console.log("username:", username);
        console.log("password:", password);
      });
    
    program
      .version("0.1.0")
      .arguments("<username> [password]")
      .description("test command")
      .action((username, password) => {
        console.log("username:", username);
        console.log("password:", password || "no password given");
      });
    

    调用形式就是 foo my-name my-password

    3 argument 和 option

    program
      .version("0.1.0")
      .argument("<username>", "user to login")
      .argument("[password]", "password for user, if required", "no password given")
      .option("-c, --check", "check option")
      .option("-C, --no-check", "no check option")
      .option("-o, --output <output>", "output options", "./temp")
      .description("example program for argument")
      .action((username, password, options) => {
        console.log("username:", username);
        console.log("password:", password);
        console.log(options);
      });
    

    调用形式就是 foo my-name my-password -C -o "/temp"

    这里使用了取反 option --no-check,当指定 -C 或者 --no-check 时,option 中的 check 为 false。(没有名为 no-check 的选项,控制的都是 check 选项的值)
    即:check 选项一共有三种值,不指定:undefined, -c/--check:true,-C/--no-check:false。

    4 command 和 option

    program
      .command("join")
      .option("-c, --check", "check option")
      .option("-o, --output <output>", "output options", "./temp")
      .description("example program for command")
      .action((options, command) => {
        console.log(options);
      });
    

    调用形式:foo join -c -o "\temp"

    这里的 join 是子命令,形式上和 argument 很像,但语义上不一样,需要根据实际业务选择不同的实现方式。

    5 command 和 argument 和 option

    program
      .version("0.1.1")
      .command("join")
      .argument("<env>", "environment")
      .argument("[second]", "second command")
      .option("-c, --check", "check option")
      .option("-o, --output <output>", "output options", "./temp")
      .description("example program for command")
      .action((env, second, options, command) => {
        console.log(env);
        console.log(second);
        console.log(options);
      });
    

    调用形式:foo join my-env my-second-argument -c --output "./temp"

    6 command 和 可变参数 和 option

    program
      .version("0.1.1")
      .command("join")
      .argument("<env>", "environment")
      .argument("<str...>", "string list")
      .option("-c, --check", "check option")
      .description("example program for variadic argument ")
      .action((env, str, options, command) => {
        console.log(env);
        console.log(str);
        console.log(options);
      });
    

    调用形式 foo join my-env s1 s2 s3 s4 -c

    这里 s1 s2 s3 s4 都会放到 str 数组中

    7 command 使用独立的处理文件

    program
      .version("0.1.0")
      .command("install [name]", "install one or more packages") // index-install
      .command("search [query]", "search with optional query", {
        executableFile: "mySearchSubCommand",
      })
      .command("list", "list packages installed", { isDefault: true });
    

    如果没有指定文件名,则使用 当前文件名-command 的形式查找处理文件,否则报错,如这里的 install 子命令。
    如果指定了文件名,则使用指定的文件名(相对路径),如这里的 search 子命令。
    具体执行文件中怎么写呢?其实就是一个新的命令行解析处理。

    如下,同样可以继续使用 command argument option

    const { Command } = require('commander');
    const program = new Command();
    
    program
    .argument("<abc>")
      .option('--ignore-case', 'ignore case',false)
      .action((abc,options,command)=>{
          console.log("action",abc);
          console.log("action",options);
          console.log("action",command.args);
      });
    
    program.parse(process.argv);
    
    const arguments = program.args;
    const options = program.opts();
    
    console.log("@",arguments);
    console.log("@",options);
    console.log("@",program.processedArgs);
    

    8 异步处理

    上面的模板说明中,使用的是同步处理方式(program.parse()),如果需要异步处理,则使用 await program.parseAsync(process.argv)

    async function run() {
      /* code goes here */
    }
    
    async function main() {
      program.command("run").action(run);
      await program.parseAsync(process.argv);
    }
    

    示例代码

    JasonGrass/git-command-helper

    其它

    github social image generate
    Github Social Image Generator - Bannerbear

    原文链接:https://www.cnblogs.com/jasongrass/p/15620575.html

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    使用history.back()出现"警告: 网页已过期的解决办法"
    thinkphp5 如何将带分隔符的字符串转换成索引数组,并且遍历到前台
    MYSQL查询某字段中以逗号分隔的字符串的方法
    SpringBoot项目docker化
    全选Js
    【同步工具类】CountDownLatch
    Elasticsearch 2.3.2 安装部署
    从网络获取多张二维码图片,压缩打包下载
    传统的线程互斥技术:Synchronized关键字
    定时器的编写
  • 原文地址:https://www.cnblogs.com/jasongrass/p/15620575.html
Copyright © 2011-2022 走看看