使用 npm 制作命令行腳本工具(一)
本文需要對(duì) npm 有基本了解,并且安裝了 node 和 npm,如果你對(duì) npm 一無(wú)所知,請(qǐng)參閱 通俗易懂多的 Npm 入門教程 先了解基礎(chǔ)概念。
1. 什么是命令行工具
在使用 npm 安裝完全局包時(shí),我們通常會(huì)使用它們提供的命令行操作來(lái)完成工作。
npm 本身就是一個(gè)命令行工具,它隨著 node 的安裝自動(dòng)安裝,我們可以使用 npm 的命令行操作來(lái)完成諸如安裝包,卸載包等操作。

2. 為什么需要命令行工具
既然是工具當(dāng)然是用來(lái)提高效率。
比較常見(jiàn)的附帶命令行工具的全局包有腳手架工具。
你可能不理解腳手架啥意思,你可以認(rèn)為是在開(kāi)發(fā)一個(gè)項(xiàng)目時(shí),我們需要按照規(guī)范先布置好目錄結(jié)構(gòu),比如下面這樣:

現(xiàn)在我們需要頻繁的創(chuàng)建項(xiàng)目,而每個(gè)項(xiàng)目的目錄結(jié)構(gòu)都和上面一樣,你總不能一個(gè)個(gè)新建一個(gè)空目錄,再一步步新建子文件夾吧。
命令行工具可以讓我們偷會(huì)懶喝杯咖啡,它會(huì)自動(dòng)為我們創(chuàng)建指定的目錄結(jié)構(gòu)。
當(dāng)然命令行工具不僅僅可以創(chuàng)建腳手架這一個(gè)功能,換句話只要是頻繁的行為都可以使用它來(lái)制作腳本,之后一鍵完成。
本篇算是命令行制作的入門,不會(huì)介紹如何創(chuàng)建腳手架目錄,會(huì)介紹制作簡(jiǎn)單的命令行工具,可以查看版本與幫助信息。有了入門,還擔(dān)心不能改變世界嗎!!
3. 關(guān)于 process.argv 的使用
process 是 node 自帶的全局變量,可以直接使用,process.argv 可以獲得命令行中參數(shù)數(shù)組。舉個(gè)栗子:
在 d 盤根目錄下創(chuàng)建文件夾 dk-cli(d:\dk-cli)
-
在 dk-cli 目錄下新建 index.js 文件,此時(shí)目錄結(jié)構(gòu)變成這樣的:
- dk-cli + index.js -
在 index.js 中輸入以下內(nèi)容:
console.log(process.argv); -
在命令中輸入:
命令行獲取參數(shù) -
結(jié)論:
使用 process.argv 可以獲取參數(shù)數(shù)組;
數(shù)組第一項(xiàng)為 node.exe 安裝路徑;
數(shù)組第二項(xiàng)為當(dāng)前執(zhí)行 js 文件路徑,可以看到當(dāng)前執(zhí)行的是 index.js 文件,所以路徑就是 index.js 的路徑;
數(shù)組前兩項(xiàng)我們并不關(guān)心,我們只關(guān)心從第三項(xiàng)開(kāi)始的數(shù)據(jù),這些是在命令行中輸入的參數(shù),參數(shù)之間以空格隔開(kāi);
使用 process.argv.slice(2) 就表示從數(shù)組第三個(gè)值開(kāi)始截取,獲取命令行中輸入的參數(shù)數(shù)組。
4. 創(chuàng)建 dk-cli 命令行工具
-
我們希望達(dá)到的效果
命令行工具運(yùn)行結(jié)果 -
dos 窗口切換到該 dk-cli
$ cd d:\dk-cli -
創(chuàng)始化項(xiàng)目
$ npm init使用該命令會(huì)出現(xiàn)交互式提問(wèn)/回答,一路回車即可,完成操作后在 d:\dk-cli 目錄下會(huì)出現(xiàn)一個(gè) package.json 文件。
-
在 dk-cli 目錄下新建文件夾 bin
為什么文件夾叫 bin,這是大家約定俗稱的,將命令行文件都放在 bin 目錄下。
-
在 bin 目錄下新建文件 dk-cli.js
此時(shí)目錄結(jié)構(gòu)應(yīng)該是這樣的:
- dk-cli - bin + dk-cli.js + index.js + package.jsondk-cli.js 內(nèi)容如下:
#!/usr/bin/env node function run (argv) { if (argv[0] === '-v' || argv[0] === '--version') { console.log(' version is 0.0.1'); } else if (argv[0] === '-h' || argv[0] === '--help') { console.log(' usage:\n'); console.log(' -v --version [show version]'); } } run(process.argv.slice(2));文件頭部必須有 #!/usr/bin/env node 這么一行,意思是使用 node 進(jìn)行腳本的解釋程序,那下面的就可以使用 node 的語(yǔ)法了;
run 是個(gè)方法,這里不解釋,傳入?yún)?shù),if ... else 判斷輸出結(jié)果;
執(zhí)行 run 方法,參數(shù)為命令行中輸入的參數(shù);
-
打開(kāi) package.json 在對(duì)象中添加 bin 屬性
{ ... "bin": { "dk-cli": "./bin/dk-cli.js" }, ... }bin 屬性包含一個(gè)對(duì)象,對(duì)象中是鍵值對(duì),這里是 {"dk-cli": "./bin/dk-cli.js"}
這里的鍵值為 "dk-cli" 所以我們?cè)诿钚兄休斎氲氖?
$ dk-cli -v如果把這里的鍵值改為 other-cli,那么在命令行中輸入的就應(yīng)該是
$ other-cli -v簡(jiǎn)單點(diǎn)說(shuō)鍵值就對(duì)應(yīng)著命令行工具的命令名稱。
而值為 "./bin/dk-cli.js",表示在我們寫的這個(gè) dk-cli 目錄下根據(jù)這個(gè)路徑可以找到 dk-cli.js 文件,然后執(zhí)行它。
整體意思就是:在 dos 窗口中輸入鍵值"dk-cli",系統(tǒng)會(huì)幫我們自動(dòng)去執(zhí)行 "./bin/dk-cli.js" 對(duì)應(yīng)的文件 dk-cli.js。
-
將 dk-cli 目錄打成一個(gè)全局包
上面已經(jīng)完成了 80 % 的工作,接下來(lái)需要將 dk-cli 目錄在本地安裝為一個(gè)全局包,這樣 package.json 中的 bin 屬性才會(huì)起作用。
安裝本地全局包如果每一次修改了 dk-cli 工程,都要在 dos 窗口中敲一下
npm install . -g,這樣很麻煩,Npm 提供了一個(gè)簡(jiǎn)便的方法,在當(dāng)前項(xiàng)目路徑下敲入:npm link,作用和npm install . -g一樣,在測(cè)試階段帶來(lái)很大的便利。這里 . 指代的就是執(zhí)行目錄 d:\dk-cli。因?yàn)槲覀儼惭b的是 dk-cli 下的 package.json 文件。
-
現(xiàn)在可以在 dos 窗口中測(cè)試結(jié)果了
命令行工具運(yùn)行結(jié)果



