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.jsconst 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);
时间: 2024-10-12 13:52:07

node生成自定义命令(yargs/commander)的相关文章

如何使用Node.js编写命令工具——以vue-cli为例

vue-cli全局安装之后,提供了vue命令和vue init.vue list.vue build三个子命令,通过命令可以搭建基于vue.js的脚手架项目.本文简单介绍一下这些命令是如何实现的. vue-cli的项目目录 如下图,由之前文章介绍,npm安装过程中,可以利用package.json中bin字段的配置,将bin目录下的命令文件软连到全局命令.也就是说在/usr/local/bin下生成了四个软连命令:vue.vue-build.vue-list.vue-init.    vue命令

linux移植u-boot(一)——U-Boot详解+自定义命令实战

linux移植u-boot(一)--U-Boot详解+自定义命令实战 2015-02-07 一.Bootloader ????简单地说:Bootloader主要功能就是 在系统上电时开始执行,初始化硬件和设备,准备好软件环境,最后调用操作系统. ????具体的包含:关闭你看门狗WATCHDOG,改变系统时钟,初始化存储控制器 ,将操作系统内核代码复制到内存中去运行. ????为了开发方便,可以增加网络功能,从PC上通过串口或者网络下载文件,烧写文件,将flash上的内核代码解压后运行等. Boo

在JavaScript中生成自定义的对象

使用对象便于组织信息.下面我们介绍如何在JavaScript中生成自定义的对象. ---------------------- JavaScript 对象 在前面几章中我们学到JavaScript中有些内置的对象,比如String, Date, Array等等.除此之外,你还可以定义自己的对象. 对象是一种特殊的数据,含有属性和函数. 下面让我们用一个例子来说明:比如一个人是一个对象.属性是与对象有联系的值,比如人的属性包括姓名,身高,体重,年龄,肤色,眼睛的颜色等等.所有人都有这些属性,但是每

Linux 系统中 如何配置自定义命令 (Mac本同样适用)

我相信  熟悉Linux的同学们  都有一个烦恼  就是 如果要查看某一个文件的时候   要一级或者多级的去cd切换目录,哪有木有便捷的方法来随意切换呢?  就像快捷键一样这就是在 Linux 系统中配置自定义命令,很简单?? 在文件/root/.bashrc中,添加以下行: alias mycommand = "cd /root" 在终端直接执行mycommand就会执行cd /root ??:    source ~/.bash_profile  这个命令一定要记得执行,这一行命令

Linux应用:Vim自定义命令

1. 自定义命令设置 ":command 选项 自定义命令 操作": 定义一个命令 ":command! ...": 重定义一个命令(修改) ":delcommand 自定义命令": 删除自定义命令 *注1: 自定义命令必须以"大写"字母开始 2. 自定义命令选项-参数 1) 参数个数说明              -nargs=0  无参数       -nargs=1  一个参数       -nargs=*  任意数目的

项目属性-->生成事件-->后期生成事件命令行

以开源记牌器https://github.com/Epix37/Hearthstone-Deck-Tracker 为例,Hearthstone Deck Tracker项目中的后期生成事件命令行: if "$(ConfigurationName)" == "Release" ( rmdir /S /Q "..\Hearthstone Deck Tracker" mkdir "..\Hearthstone Deck Tracker&quo

转变思维--使用Python生成Shell命令,批量执行程序

近日经常遇到在Linux shell中批量执行相似命令的情况.比如执行如下命令: gifsicle --delay=100 gif/App_1_hour_*_down.gif > combine_gif/App_1_hour_down.gif gifsicle --delay=100 gif/App_1_hour_*_up.gif > combine_gif/App_1_hour_up.gif gifsicle --delay=100 gif/App_2_hour_*_down.gif >

BW:如何加载和生成自定义的层次结构,在不使用平面文件的SAP业务信息仓库

介绍 通常情况下,报告需要在一个类似树的结构来显示数据.通过启用此特性在SAP BW层次结构.高级数据显示的层次结构的顶层节点.更详细的数据可以向下钻取到的层次结构中的下级节点的可视化. 考虑一个例子层次的客户联络层次",用于限定电信呼叫中心接收电话. 图1:客户联络层次 BW)" src="http://hi.csdn.net/attachment/201102/18/0_1298015417vklV.gif"> 加载层次结构的标准机制 有几种可能性供货与S

用PowerDesigner生成自定义建表语句

原文:用PowerDesigner生成自定义建表语句 我们经常用PowerDesigner来进行数据库表结构的设计,并且设计出来的表比较直观的看出之间的相互关系,方便理解:但其自动生成的脚本并不一定符合我们实际需求,所以需要经过一定配置后才能真正达到要求,下面用一个简单的案例来学习如何配置PD. 需求: 这里假设数据库代码版本维护是通过sql脚本文件来管理的,构造可重复执行的创建表.添加字段.索引等 用PowerDesigner生成符合自己实际需求的脚本,要求如下 1.建表语句可重复执行 2.表