process.argv与命令行工具

process.argv

process是node中的一个模块,经过访问process.argv咱们能轻松愉快的接收经过命令执行node程序时候所传入的参数。node

[info] argv翻译成中文意思是:命令行变元数组。linux

这是什么意思呢?咱们都在命令行窗口中使用过npm命令来进行包的下载,在使用npm命令的时候咱们还能进行一些传参,像要下载的包的名字啊,是开发依赖仍是生产依赖啊。npm

这些所传的参数+node.exe绝对路径+node所执行文件的绝对路径所组成的数组 = process.argv。它不止包含所传的参数还包含另外两个东东做为数组成员,故称之为变元数组。json

示例1

// 文件p1.js中
console.log(process.argv);

>>>命令行中输入
node p1.js --a -b c

<<< 输出
E:\w>node p1.js --a -b c
[ 'C:\\Program Files\\nodejs\\node.exe',
  'E:\\w\\p1.js',
  '--a',
  '-b',
  'c' ] 
  
复制代码

批处理文件

批处理文件,顾名思义,它能达到经过只执行一个文件从而执行多条node命令的效果,它能极大的简化咱们在命令行中的输入,咱们只须要输入批处理文件的名字,甚至不须要输 node这个前缀。 批处理文件在不一样的操做系统下是不同的,主要分为:windows

  • window下的批处理文件
  • 类linux下的批处理文件

windows中的批处理文件

windows中的批处理文件后缀名为.bat数组

//hello.bat文件中
node p.js -a hello -b world

>>>命令行中
hello //为xx.bat文件去掉后缀的文件名

<<<输出
[ 'C:\\Program Files\\nodejs\\node.exe',
  'E:\\w\\p1.js',
  '-a',
  'hello',
  '-b',
  'world' ]
复制代码

占位符

在上面的栗子中有一个问题,咱们所传入的参数是固定的,要想它不固定,须要在.bat文件中使用占位符取代本来固定的参数,再在执行批处理文件时经过传参进行映射。bash

//hello.bat文件中
node p.js %1 %2 %3 %4

>>>命令行中输入
hello -a hello -b world //为xx.bat文件去掉后缀的文件名

<<<输出
[ 'C:\\Program Files\\nodejs\\node.exe',
  'E:\\w\\p1.js',
  '-a',
  'hello',
  '-b',
  'world' ]
复制代码

[warning] 注意:工具

  • 此时%后面的数字表明了%x这个占位符表明是第几个传入的参数
  • %x是从%1开始的而不是%0

上面虽然使传参所传入的参数值再也不固定化了,但个数仍然是固定的,so咱们推荐下面这种类linux的批处理文件。ui

类linx中的批处理文件

此时,咱们再也不须要.bat后缀名,咱们的批处理文件名直接就是xxx(再也不须要后缀)。spa

给文件添加可执行权限

倘若咱们要执行的文件名为hello,要执行这个批处理文件,咱们须要先给它添加可执行权限

$ chmod +x hello
复制代码

告诉命令行让谁来执行这个文件里的内容

接着,在这个文件中添加一句话,意思是让node来执行这个命令

#! /usr/bin/env node
复制代码

'./'执行文件

最后,如何执行这个文件呢,只须要访问它便可

>>>输入
$ ./hello --a -b c

<<< 输出
[ 'C:\\Program Files\\nodejs\\node.exe',
  'E:\\w\\hello',
  '--a',
  '-b',
  'c' ]
复制代码

[danger] 注意: 此时./是必须的

npm link

若是咱们想在输入命令时不须要输入前面的'./',咱们就须要用到npm link了。 首先,在package.json下,添加这么一段

"bin":{
	"hello":"hello" //前者为咱们输入的命令,后者为要执行的文件的路径(包括文件名)
}
复制代码

接着在package.json所处目录下的命令行中输入

npm link
复制代码

这样咱们就无需在输入命令时候还要加上./前缀。

[important]注意:

  1. 这是由于npm link后,命令行中的命令指向了npm目录bat文件(npm-link后会自动在npm目录下生成,其做用是将package.json中咱们所配置的那个可执行文件挂到这个.bat下),而 bat文件又指向了当前目录 (package.json所处目录)的hello文件(路径)。

  2. npm link 必须配合 #! /usr/bin/env node,不然windows会报脚本执行错误

yargs

yargs能帮助咱们在被执行的文件里所接受的参数进行包装处理。 yargs.argv就是包装后的process.argv,除此以外咱们还能经过yargs.options对这个包装对象再进行进一步的订制。

[important] 注意: 和process.argv很大的不一样是它返回的是一个对象而不是数组,以连词线 ---开头的参数会做为对象中的一个key值,而它后面的非连词线开头的参数会做为key的值,若是后面没有非连词线开头的参数则会返回true

//hello文件中
#! /usr/bin/env node
let yargs = require('yargs');

let argv = yargs.argv; //.argv是必须的

console.log(argv);

>>>命令行中输入
$ ./hello --a 1 -b 2 c

<<<输出
{ _: [ 'c' ],
  help: false,
  version: false,
  a: 1,
  b: 2,
  '$0': 'hello',}

console.log(argv.a); 
<<<输出
1
复制代码

下划线属性

咱们能够经过访问argv._来获取非连词线开头的参数

>>>命令行中输入
$ ./hello d --a 1 -b 2 c

<<<输出
[ 'd', 'c' ]
复制代码

命令行参数的配置

多个不一样参数的配置经过.option隔开

#! /usr/bin/env node
let yargs = require('yargs');
// let argv = yargs.argv;

let argv = yargs.options('a',{
  alias:'ant'
  ,demand:true
  ,default:'super'
  ,describe:'一只灰常大的蚂蚁'
  ,boolean:false
  ,type:'string'
}).options('b',{
  alias:'BB'
  ,describe:'woshi bb'
  ,boolean:false
}).argv;

console.log(argv._);
console.log(argv);

>>>命令行中输入
$ ./p1.js -a valueA -b valueB -c

<<<输出
[]
{ _: [],
  help: false,
  version: false,
  a: 'valueA',
  ant: 'valueA',
  b: 'valueB',
  BB: 'valueB',
  c: true,
  '$0': 'p1.js' }

复制代码

配置项说明:

  • alias:别名,当传入a时也会同时生成ant
  • demand:该参数是否必须
  • default:默认值
  • describe:参数描述
  • boolean:设置为true时,若该参数没有传入则会将该参数的值设置为false
  • type:限制传入参数的类型

配置帮助信息

首先yargs已经默认为咱们提供了--help参数来显示帮助信息,咱们一样的,能够给这个--help参数配置个别名来简化

let argv = yargs.此处省略一万字.help('h').argv

>>>命令行中输入
$ ./p1.js --h

<<<输出

选项:
  --version  显示版本号                                                   [布尔]
  -a, --ant  一只灰常大的蚂蚁                  [字符串] [必需] [默认值: "super"]
  -b, --BB   woshi bb                                                     [布尔]
  -h         显示帮助信息                                                 [布尔]
复制代码

配置其它的帮助提示

  • usage:用法格式
  • example:一个详细的使用栗子
  • epilog:结尾处的显示,经常使用来显示命令工具的版本行
// hello文件中
...
.help('h')
.usage('hello -[option] value')
.example('我,栗子,让你明白!')
.epilog('copyright 2018-')
.argv;

>>>
$ ./hello -h

<<<
hello -[option] value

选项:
  --version  显示版本号                                                   [布尔]
  -a, --ant  一只灰常大的蚂蚁                  [字符串] [必需] [默认值: "super"]
  -b, --BB   woshi bb                                                     [布尔]
  -h         显示帮助信息                                                 [布尔]

示例:
  我,栗子,让你明白!

copyright 2018-
复制代码

yargs实现思路

let args = process.argv;
let argv = {};
for(let i=2;i<args.length;++i){
  let cur = args[i];
  if(/^(--)/.test(cur)){
    argv[cur.slice(2)] = args[++i];
  }
}
复制代码
相关文章
相关标签/搜索