開發命令行原理
看似很神奇的功能,其實本質十分簡單。
#!/usr/bin/env node
這句話,告訴了*nix
系統,當前文件,應該使用什麼工具/軟件來執行
而這,就是 node 開發命令行工具的原理。也是其它語言開發命令行工具的原理,可以對比於 windows 下的 bat 文件。
基礎知識
既然講到基礎,那就儘可能使用原生的語言、不引用多餘模塊的方式進行開發。
Node 命令行工具開發中,最重(常)要的代碼/原生語句就是
1. process 系列:
process.argv;
process.on(single, callback);
process.exit(0);
其中, process.argv
用於獲取敲擊命令時,傳入的參數;
process.exit()
用來退出程序,0 表示正常退出;process.on()
用來監聽、接收系統傳過來的信號(一般使用 kill -s
來傳遞 SINGLE 信號)
- node 系列:
這個系列的比較多。在使用
process
獲取到輸入的參數,node 就可以根據這些參數去做一些想做的事了。
如果操作完後,想操作文件,保存、修改、上傳什麼的,那就要用到其它模塊了。這裏也給 Node 的模塊參考。比如:
path
、fs
、request
等了。
生成可執行命令
- 寫好的文件,在
*nix
系統中,是隻有讀寫操作的。需要更改文件的可執行屬性。
chmod 755 targetFile
- 修改屬性後的文件,具有了可以被執行的能力。在文件所在的目錄下,敲入
./targetFile [arg1 arg2 ...]
即可執行. arg* 爲你想傳入的參數。
3. 這個時候,使用起來並不方便。我們可以使用 npm link
將當前文件軟鏈接至全局對象下.
{
"name": '你的工具名',
"bin": {
"myCommand": targetFile
}
}
其中 myCommand
是你要在全局中使用該工具的名字。比如,你想輸入 doSomething
來運行你寫的工具。targetFile
指的是你寫的文件名。即包含 #!/usr/bin/env node
語句的文件。
簡單 Demo
以做一個命令行版本的翻譯工具爲例。
1. 創建文件夾 /translate/
mkdir translate
- 打開文件夾。這裏默認使用的是 vscode
code ./translate/
- 編寫 index.js
#!/usr/bin/env node
'use strict';
let q = require('request');
let word = process.argv[2] || 'try once';
q.get('http://fanyi.youdao.com/openapi.do?keyfrom=node-translator&key=2058911035&type=data&doctype=json&version=1.1&q=' + word, function(error, res, body){
console.log('get the ', word, " is: ", JSON.parse(body).translation);
});
這裏使用了網易的 API。參考,並引用了 正凱 的博文。由於現在申請 AI youdao 比以前麻煩很多,故直接使用了 正凱 的接口,大家用作參考即可,正式使用。
- 修改
index.js
的屬性
chmod 755 index.js
- 編寫
package.json
文件。在同目錄下,編寫
{
"name": "clchenliang de fanyi",
"bin": {
"see": "index.js"
}
}
- 生成軟鏈,全局使用。在當前目錄下,輸入:
npm link
測試
在我自己的機子上,進行測試。任意目錄下,輸入
see awesome
代碼
process.exit(0)
常用的模塊
- yargs
- shelljs
TJ
大神寫的 command.js- color.js
命令行開發基礎知識
node 交互
敲代碼時遇到的問題
#!
後跟路徑: #!/usr/bin/env
容易把#!/
當成一個操作符
*nix 系列操作系統將該語句當作解釋器,用來解釋、編譯接下來的語句npm link process.argv 的形式有哪些,命令行參數、子命令 kill -s
命令行顏色控制
這一部分比較簡單,也不屬於太核心的概念,大家可以自行了解。常用的有 color.js 模塊。