不少編程語言均可以來開發命令行工具。寫代碼的時候,若是有一些簡單的小工具做爲輔助,開發效率能夠必定程度上提升。javascript
Node.js 做爲前端必須掌握的一個技術點,學習用它來開發命令行工具也是稱爲必須的一個技能了。html
下面的內容就是介紹如何開發一個命令行工具,從簡單到複雜。在最後也會列舉一些命令行參數的處理模塊,目的是讓命令行工具更加靈活。前端
首先,建立一個腳本文件,名字爲 hello
。至於爲何不使用後綴,這個應該是爲了更容易閱讀,畢竟不少執行腳本都是沒有後綴的。java
在 hello
中寫入須要執行的腳本代碼 :node
#!/usr/bin/env node console.log('hello world');
#!/usr/bin/env node
必需要寫在腳本文件的第一行,目的是用來指定該腳本文件執行的環境。在這裏指定執行環境爲 Node.js 環境。webpack
若是想讓該文件能夠執行,就須要指定該腳本文件的權限爲可執行權限。web
$ chmod 755 hello
執行結束以後,hello
就能夠執行了。npm
$ ./hello hello world
須要注意的是,在執行命令的時候必定要指定 hello
腳本文件所在的路徑,不然沒法正常執行。編程
$ hello zsh: command not found: hello
若是想讓該命令行工具能夠在全局執行,那麼能夠建立一個 package.json
文件。json
{ "name": "hello", "bin": { "hello": "hello" } }
其中 name
是未來執行命令的關鍵詞;bin
用來指定命令對應可執行腳本文件的地址。
若是 bin
中只有一個可執行腳本,能夠指定一個字符串,如 "bin": "./bin/webpack.js"
。
建立完 package.json
後,而後執行 npm link
命令。
$ npm link
該命令執行完以後,會在本機中建立一個連接,鏈接到當前腳本文件所在的目錄。
~/node/v8.9.3/bin/hello -> ~/node/v8.9.3/lib/node_modules/hello/hello ~/v8.9.3/lib/node_modules/hello -> ~/Desktop/test-cli
能夠看到全局的 hello
指向 node_modules/hello/hello
,最終指向的位置是當前腳本文件所在的地址 ~/Desktop/test-cli
。
須要說明的是,當前連接指定以後,只能到 Node.js 的全局目錄中本身刪除,或者直接刪除本身的腳本文件所在的目錄。
在處理命令行參數以前,首先要認識命令行參數。
在 Node.js 中經過 process.argv
來獲取命令行參數。
$ node test.js foo bar
這個時候經過 process.argv
獲取到的命令行參數是一個數組。
[ '/Users/negivup/.nvm/versions/node/v8.9.3/bin/node', '/Users/negivup/Desktop/test-cli/hello', 'foo', 'bar' ]
能夠看到第一個參數是 node
,第二個是腳本文件,從第三個參數開始纔是真正的輸入參數。
所以,處理命令行參數,就可使用下面的形式來處理。
#!/usr/bin/env node console.log('hello ' + process.argv[2]);
這個時候執行命令,就能夠根據輸入來決定輸出了。
$ hello wang hello wang
在這裏列舉一些經常使用的命令行參數處理模塊,爲的就是之後可以寫出更增強大的命令行工具。
yargs
和 minimist
都是用來解析命令行參數的,可是有一點須要注意的是 yargs
內部的解析引擎就是 minimist
。minimist
就是一個輕量級的命令行參數解析引擎。
它們二者共同點確定有,不一樣點就是 yargs
是對 minimist
進行了更進一步的封裝。