開發(fā)命令行原理
看似很神奇的功能,其實(shí)本質(zhì)十分簡單。
#!/usr/bin/env node
這句話,告訴了*nix系統(tǒng),當(dāng)前文件,應(yīng)該使用什么工具/軟件來執(zhí)行
而這,就是 node 開發(fā)命令行工具的原理。也是其它語言開發(fā)命令行工具的原理,可以對比于 windows 下的 bat 文件。
基礎(chǔ)知識
既然講到基礎(chǔ),那就盡可能使用原生的語言、不引用多余模塊的方式進(jìn)行開發(fā)。
Node 命令行工具開發(fā)中,最重(常)要的代碼/原生語句就是
- process 系列:
process.argv;
process.on(single, callback);
process.exit(0);
其中, process.argv 用于獲取敲擊命令時,傳入的參數(shù);
process.exit() 用來退出程序,0 表示正常退出;process.on() 用來監(jiān)聽、接收系統(tǒng)傳過來的信號(一般使用 kill -s 來傳遞 SINGLE 信號)
- node 系列:
這個系列的比較多。在使用
process獲取到輸入的參數(shù),node 就可以根據(jù)這些參數(shù)去做一些想做的事了。
如果操作完后,想操作文件,保存、修改、上傳什么的,那就要用到其它模塊了。這里也給 Node 的模塊參考。比如: path、fs、request等了。
生成可執(zhí)行命令
- 寫好的文件,在
*nix系統(tǒng)中,是只有讀寫操作的。需要更改文件的可執(zhí)行屬性。
chmod 755 targetFile
- 修改屬性后的文件,具有了可以被執(zhí)行的能力。在文件所在的目錄下,敲入
./targetFile [arg1 arg2 ...]
即可執(zhí)行. arg* 為你想傳入的參數(shù)。
- 這個時候,使用起來并不方便。我們可以使用
npm link將當(dāng)前文件軟鏈接至全局對象下.
{
"name": '你的工具名',
"bin": {
"myCommand": targetFile
}
}
其中 myCommand 是你要在全局中使用該工具的名字。比如,你想輸入 doSomething 來運(yùn)行你寫的工具。targetFile 指的是你寫的文件名。即包含 #!/usr/bin/env node 語句的文件。
簡單 Demo
以做一個命令行版本的翻譯工具為例。
- 創(chuàng)建文件夾
/translate/
mkdir translate
- 打開文件夾。這里默認(rèn)使用的是 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);
});
這里使用了網(wǎng)易的 API。參考,并引用了 正凱 的博文。由于現(xiàn)在申請 AI youdao 比以前麻煩很多,故直接使用了 正凱 的接口,大家用作參考即可,正式使用。
- 修改
index.js的屬性
chmod 755 index.js
- 編寫
package.json文件。在同目錄下,編寫
{
"name": "clchenliang de fanyi",
"bin": {
"see": "index.js"
}
}
- 生成軟鏈,全局使用。在當(dāng)前目錄下,輸入:
npm link
測試
在我自己的機(jī)子上,進(jìn)行測試。任意目錄下,輸入
see awesome
如下圖:
