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];
  }
}
複製代碼
相關文章
相關標籤/搜索