node生成自定义命令(yargs/commander)

Posted 六石

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node生成自定义命令(yargs/commander)相关的知识,希望对你有一定的参考价值。

 

第一部分可以生成一个自定义命令,例如常见的”express”,yargs和commander则可以在生成的自定义命令上做扩展,yargs将命令扩展成类似express --l xx的形式;而commander则可以扩展成类似 ‘express install xx’形式,也可以扩展成express -e xx的形式,前者写法简单,后者扩展性更好。

 

  1. 生成自定义命令
  2. yargs
  3. commander
  4. 完整例子

生成自定义命令

  1. 新建文件夹test,并进入;
  2. 执行npm init 生成package.json文件;
  3. 同级目录下新建hello js,内容如下:
 #! /usr/bin/env node

\'use strict\'
;
console.log(\'123\');
  1. package.json里添加内容"bin": {"hello": "hello.js"}:
//package.json

{
"name": "hello",
"version": "1.0.0",
"description": "",
"main": "index.js",
"bin": {"hello": "hello.js"},

"scripts": {
"test": "echo \\"Error: no test specified\\" && exit 1"
},
"author": "",
"license": "ISC"
}
  1. 执行命令npm link;

  2. 命令行输入hello可看到效果 ——————123;

yargs

yargs所实现的功能是可以根据用户命令行输入选项参数的不同而达到改变node环境变量修改全局变量global,从而实现个性定制的功能

//index.js
const argv = require(\'yargs\').argv;
if (argv.l == \'zh-cn\') {
console.log(\'Chinese site!\')
} else if (argv.l == \'en\') {
console.log(\'English site!\')
}
//命令行
node yangs.js --l=zh-cn //Chinese site!
node yangs.js --l=en //English site!

Commander

生成自定义命令里将文件的启动转换为一个自定义命令,而commander则可以在自定义命令基础上做命令的扩展(带参数等);

  1. API 
    整体代码自上到下执行,如果没有碰到parse,则其前面的options不会触发,所以要注意process.xx的写法。

    • version(‘0.0.1’) 版本号;
    • usage(‘zhao’) 名字
    • description(‘hello ,I\\’m zhao’) 描述
    • allowUnknownOption 取消接收到未定义option时报错的机制,不报错;
    • command(‘ab’) 定义子命令;
    • alias(‘a’) 定义子命令的短命令;
    • option(‘-p, –peppers’,’Add oeooers’) 自定义选项参数和描述
    • action(cb) 回调
    • parse(process.argv); 至于末尾,解析命令行输入的命令;
  2. 总结 
    我在command,action和option,program.xx这两个组合里绕了很多弯路,总结如下


    #!/usr/bin/env node


    \'use strict\'
    ;

    const program = require(\'commander\');

    program
    .version(\'0.0.1\')
    .usage(\'例子\')
    .description(\'this is a lizi of commander\')

    program
    .command(\'hello [st]\')
    .action(function(st,value){
    hello(st,value);
    })

    function hello(val,o){
    console.log(val);
    console.log(1);
    console.log(o)
    }

    program
    .option(\'-s --save [value]\',\'保存\')

    program.parse(process.argv);

    if (program.save){
    console.log(program.save);
    }

    • 保持两个组合各自独立,command/action组合,option/program.xx组合, 
      命令行中不能同时出现command子命令和option选项,即lizi hello 23 -s 25是错误的;
    • 当尝试lizi -s 23在命令行输出true而非值的时候,是没有在长选项后跟上[xx];
    • program.s可能会有三种情况出现,一是当输入其他可选项的时候,当尝试lizi -t (xx)时,program.sundefined;二是当输入lizi -s时,program.s为默认值,不设置默认值则为true;三是当输入lizi -s xx时,program.s为xx;

两个完整例子

注意:写好下面代码在执行前需要npm link 绑定关系;

例子1: yargs和生成自定义命令的组合

//package.json
{
"name": "lizi",
"version": "1.0.0",
"description": "",
"main": "index.js",
"bin": {
"lizi1":"lizi1.js"
},
"scripts": {
"test": "echo \\"Error: no test specified\\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"commander": "^2.9.0"
}
}

//lizi1.js
#!/usr/bin/env node

\'use strict\'
;

console.log(1);

const argv = require(\'yargs\').argv;

if (argv.l == \'zh-cn\') {
console.log(\'Chinese site!\')
} else if (argv.l == \'en\') {
console.log(\'English site!\')
}

例子2: commander和生成自定义命令的组合

//package.json
{
"name": "lizi",
"version": "1.0.0",
"description": "",
"main": "index.js",
"bin": {
"lizi":"lizi.js"
},
"scripts": {
"test": "echo \\"Error: no test specified\\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"commander": "^2.9.0"
}
}


//lizi.js

#!/usr/bin/env node

\'use strict\'
;

const program = require(\'commander\');

program
.version(\'0.0.1\')
.usage(\'例子\')
.description(\'this is a lizi of commander\')

program
.command(\'hello [st]\')
.action(function(st,value){
hello(st,value);
})

function hello(val,o){
console.log(val);
console.log(1);
console.log(o)
}

program
.option(\'-f --flag [value]\',\'保存\',\'ha\')
.option(\'-t --tale [value]\',\'保存\')

program.parse(process.argv);

if (program.flag){
global.flag = program.flag;
}

console.log(global.flag);

以上是关于node生成自定义命令(yargs/commander)的主要内容,如果未能解决你的问题,请参考以下文章

node自定义模块的路径查找

laravel 自定义命令生成 servicerepository层

不止命令行!自定义VS生成事件

laravel 自定义命令生成 servicerepository层

drupal 8 ——自定义权限

如何给JsTree生成的树的每个节点添加上自定义的右键菜单