使用 npm 制作命令行腳本工具

使用 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)完成諸如安裝包,卸載包等操作。

npm 命令行工具

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.json
    
    

    dk-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é)果
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前端日常開(kāi)發(fā)中,會(huì)遇見(jiàn)各種各樣的cli,比如一行命令幫你打包的webpack,一行命令幫你生成vue項(xiàng)目模板的vu...
    CharTen閱讀 19,351評(píng)論 6 40
  • 一種編程語(yǔ)言是否易用,很大程度上,取決于開(kāi)發(fā)命令行程序的能力。 Node.js 作為目前最熱門的開(kāi)發(fā)工具之一,怎樣...
    豬豬9527閱讀 845評(píng)論 0 1
  • 前言 用過(guò)構(gòu)建工具的親們知道,通常通過(guò)全局安裝一個(gè) xxx-cli 的 npm 包,就能在命令行用命令進(jìn)行構(gòu)建。那...
    唯泥Bernie閱讀 1,901評(píng)論 0 1
  • Node 開(kāi)發(fā)離不開(kāi) npm,而腳本功能是 npm 最強(qiáng)大、最常用的功能之一。 本文介紹如何使用 npm 腳本(n...
    6e5e50574d74閱讀 3,575評(píng)論 0 2
  • 今天天氣非常棒!心情也非常好,馬上就要開(kāi)課了,今天的工作就是整理開(kāi)課物資,跟參加學(xué)習(xí)的學(xué)員做好確定,過(guò)去舉辦那么多...
    何德勝覺(jué)悟閱讀 235評(píng)論 5 3

友情鏈接更多精彩內(nèi)容