node生成自定义命令(yargs/commander)
第一部分可以生成一个自定义命令,例如常见的”express”,yargs和commander则可以在生成的自定义命令上做扩展,yargs将命令扩展成类似express --l xx的形式;而commander则可以扩展成类似 ‘express install xx’形式,也可以扩展成express -e xx的形式,前者写法简单,后者扩展性更好。
- 生成自定义命令
- yargs
- commander
- 完整例子
生成自定义命令
- 新建文件夹
test,并进入; - 执行
npm init生成package.json文件; - 同级目录下新建
hello js,内容如下:
#! /usr/bin/env node
'use strict';
console.log('123');
- 在
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"
}
执行命令
npm link;命令行输入
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则可以在自定义命令基础上做命令的扩展(带参数等);
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); 至于末尾,解析命令行输入的命令;
总结
我在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.s为undefined;二是当输入lizi -s时,program.s为默认值,不设置默认值则为true;三是当输入lizi -s xx时,program.s为xx;
- 保持两个组合各自独立,command/action组合,option/program.xx组合,
//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)的更多相关文章
- 【AMAD】django-extensions -- Django框架的自定义命令扩展集合
动机 简介 个人评分 动机 使用Django进行开发的时候,会不会感觉开发工具少了一些.比如每次进入python shell调试的时候要重新import每个model. 简介 django-exten ...
- 如何使用Node.js编写命令工具——以vue-cli为例
vue-cli全局安装之后,提供了vue命令和vue init.vue list.vue build三个子命令,通过命令可以搭建基于vue.js的脚手架项目.本文简单介绍一下这些命令是如何实现的. v ...
- 通过用 .NET 生成自定义窗体设计器来定制应用程序
通过用 .NET 生成自定义窗体设计器来定制应用程序 https://www.microsoft.com/china/MSDN/library/netFramework/netframework/Cu ...
- 3.Node.js 自定义微信菜单
文章目录: 1.Node.js 接入微信公众平台开发 2.Node.js access_token的获取.存储及更新 3.Node.js 自定义微信菜单 ...
- python生成linux命令行工具
您是否也曾一直想生成类似cd, cat等小巧/迷人/实用的小工具作为系统命令或者将python程序打包为exe进行分发?ok,机会来了.利用python 的argparse 和 pyinstaller ...
- linux_shell自定义命令
一.命令可执行文件所在目录 shell命令可执行文件所在目录是保存在环境变量PATH中的,终端输入如下命令查看 PATH 环境变量的内容: $ echo $PATH 我的linux输出如下: /opt ...
- TensorFlow进阶(六)---模型保存与恢复、自定义命令行参数
模型保存与恢复.自定义命令行参数. 在我们训练或者测试过程中,总会遇到需要保存训练完成的模型,然后从中恢复继续我们的测试或者其它使用.模型的保存和恢复也是通过tf.train.Saver类去实现,它主 ...
- 如何用Git.io来生成自定义后缀名的短网址
如何用Git.io来生成自定义后缀名的短网址 git.io是Github的官方短网址,它是用来缩短Github上项目的网址. 效果:Git.io/wacsh将会跳转到https://xhemj.git ...
- 编写 Dockerfile 生成自定义镜像
一般情况下我们可以从公共渠道诸如 DockerHub 获取镜像上获取镜像,但是在实际生产过程中,往往需要定制化的镜像,例如修改一些配置文件,增加一些特殊的命令或软件等需求,这时就需要通过编写 Dock ...
随机推荐
- ubuntu11.10搭建eclipse C++开发环境[zhuan]
1.最重要的东西,C++必要工具,安装的是GCC工具链,Make等一系列开发工具: sudo apt-get install build-essential 2. 安装Eclipse sudo apt ...
- Codeforces Round #382 (Div. 2)B. Urbanization 贪心
B. Urbanization 题目链接 http://codeforces.com/contest/735/problem/B 题面 Local authorities have heard a l ...
- Chapter 5. Graph Theory:: Fundamentals:: Intermediate
10457 - Magic Car 题意一开始看起来有点费解,其实最后就是要起点到终点的路径上最大边与最小边之差越小越好.这样我们可以先将边排个序,然后枚举路径上的最小边,之后依次将比它大的边按升序的 ...
- IOS中的多线程之GCD
在ios中,使用多线程有三种方式,分别是:NSThread.NSOperation和NSOperationQueue.GCD,在本节,主要讲解一下CDD的使用. GCD(Grand Central D ...
- 数据库中字段类型对应的C#中的数据类型
数据库中字段类型对应C#中的数据类型: 数据库 C#程序 int int32 text string bigint int64 binary System.Byte[] ...
- Pro ASP.NET MVC –第五章 使用Razor
Razor是微软在MVC3中引入的视图引擎的名字,在MVC4中对其进行了改进(尽管改动非常小).视图引擎处理ASP.NET内容.寻找指令,典型地用于插入动态数据并输出到浏览器中.微软维持了两个视图引擎 ...
- Java与邮件系统交互之使用Socket验证邮箱是否存在
最近遇到一个需求:需要验证用户填写的邮箱地址是否真实存在,是否可达.和普通的正则表达式不同,他要求尝试链接目标邮箱服务器并请求校验目标邮箱是否存在. 先来了解 DNS之MX记录 对于DNS不了解的,请 ...
- 康力优蓝机器人 -- 优友U05类人型机器人发布
[寒武计划]优友U05类人型机器人发布: http://digi.tech.qq.com/a/20151124/043234.htm?pgv_ref=aio2015&ptlang=2052 北 ...
- WIN8 下Cisco VPN连接 出现vpn 422 failed to enable virtual adapter错误
今天在家用VPN软件连接,出现了“vpn 422 failed to enable virtual adapter”的错误,系统安装的是Win8专业版32位,百度了半天又很多方法解决不了,后来发现了一 ...
- iOS开发之时间格式的转化
在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理. 例如:如何将格式为“12-May-14 05.08.02.000000 PM” ...