第一部分可以生成一个自定义命令,例如常见的”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)的更多相关文章

  1. 【AMAD】django-extensions -- Django框架的自定义命令扩展集合

    动机 简介 个人评分 动机 使用Django进行开发的时候,会不会感觉开发工具少了一些.比如每次进入python shell调试的时候要重新import每个model. 简介 django-exten ...

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

    vue-cli全局安装之后,提供了vue命令和vue init.vue list.vue build三个子命令,通过命令可以搭建基于vue.js的脚手架项目.本文简单介绍一下这些命令是如何实现的. v ...

  3. 通过用 .NET 生成自定义窗体设计器来定制应用程序

    通过用 .NET 生成自定义窗体设计器来定制应用程序 https://www.microsoft.com/china/MSDN/library/netFramework/netframework/Cu ...

  4. 3.Node.js 自定义微信菜单

    文章目录:         1.Node.js 接入微信公众平台开发         2.Node.js access_token的获取.存储及更新         3.Node.js 自定义微信菜单 ...

  5. python生成linux命令行工具

    您是否也曾一直想生成类似cd, cat等小巧/迷人/实用的小工具作为系统命令或者将python程序打包为exe进行分发?ok,机会来了.利用python 的argparse 和 pyinstaller ...

  6. linux_shell自定义命令

    一.命令可执行文件所在目录 shell命令可执行文件所在目录是保存在环境变量PATH中的,终端输入如下命令查看 PATH 环境变量的内容: $ echo $PATH 我的linux输出如下: /opt ...

  7. TensorFlow进阶(六)---模型保存与恢复、自定义命令行参数

    模型保存与恢复.自定义命令行参数. 在我们训练或者测试过程中,总会遇到需要保存训练完成的模型,然后从中恢复继续我们的测试或者其它使用.模型的保存和恢复也是通过tf.train.Saver类去实现,它主 ...

  8. 如何用Git.io来生成自定义后缀名的短网址

    如何用Git.io来生成自定义后缀名的短网址 git.io是Github的官方短网址,它是用来缩短Github上项目的网址. 效果:Git.io/wacsh将会跳转到https://xhemj.git ...

  9. 编写 Dockerfile 生成自定义镜像

    一般情况下我们可以从公共渠道诸如 DockerHub 获取镜像上获取镜像,但是在实际生产过程中,往往需要定制化的镜像,例如修改一些配置文件,增加一些特殊的命令或软件等需求,这时就需要通过编写 Dock ...

随机推荐

  1. [aaronyang]WPF4.5 - AyTabControlBase样式分享,绝对好看

    样式代码如下: 对于博客园将文章移除首页的做法:我就迁移了.文章已经迁移:http://www.ayjs.net/post/75.html 由于例子比较简单,你只要指定Style即可,难点,透明区域的 ...

  2. SQL Server 2008|2012 阻止保存要求重新创建表的更改

    不是很理解为什么在SQL Server 2008及以后的版本中会加入阻止保存要求重新创建表的更改这个选项.太麻烦了,每次修改表结构的时候会被"阻止".很不方便. 问题描述: SQL ...

  3. mac添加环境变量

    两个问题: 1.nodejs的安装 使用Mac OS X Binaries (.tar.gz)(64位)来安装: http://www.nodejs.org/download/ 安装参照:http:/ ...

  4. C# 调用百度地图Web服务API

    最近公司项目中需要根据两个地点的交通路径和距离做一些数据推荐,为了程序的稳定和用户体验所以想从百度地图 API 采集数据保存到数据库中,经过一翻研究之后选定了百度地图 Web 服务 API 中的 Di ...

  5. hibernate下载包中配置文件路径

    路径:hibernate-release-5.0.2.Final\project\hibernate-ehcache\src\test\resources\hibernate-config 文件:hi ...

  6. sys.stdout sys.stderr的用法

    stdout:标准输出 stderr:标准错误 print  相当于 sys.stdout.write() + 换行 一个将数据流写入文件的程序,文件名为:main.py def main(out=s ...

  7. 客户端配置文件tnsname.ora

    ARP2 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 182.168.1.173)(PORT = 1521) ...

  8. VS2010 项目引用了微软企业库,但是编译时提示:未能找到类型或命名空间名称

    我写的是控制台程序 是在引用我自己写的库 和 Microsoft.Practices.EnterpriseLibrary 时出现的问题 经过分析,和百度 找到了修改方法 打开  项目属性-->应 ...

  9. Codeforces Round #184 (Div. 2) E. Playing with String(博弈)

    题目大意 两个人轮流在一个字符串上删掉一个字符,没有字符可删的人输掉游戏 删字符的规则如下: 1. 每次从一个字符串中选取一个字符,它是一个长度至少为 3 的奇回文串的中心 2. 删掉该字符,同时,他 ...

  10. Linux查看系统信息命令汇总

    # uname -a # 查看内核/操作系统/CPU信息 # /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算 ...