如何用nodejs寫一個(gè)像hap-toolkit那樣的命令行工具

當(dāng)前在移動(dòng)端開發(fā)多個(gè)典型問題的系統(tǒng)解決方案中,常常用nodejs來幫助開發(fā)一套輔助工具,以便于使用或者調(diào)試。

我們在建設(shè)應(yīng)用發(fā)布平臺(熱修復(fù)平臺)的過程中,即用nodejs開發(fā)了一套apub工具(類似于快應(yīng)用的hap-toolkit工具鏈),將本地編譯輸出結(jié)果,生成下載鏈接,以二維碼的方式提供掃碼下載。

移動(dòng)開發(fā)的一些典型問題(如:熱修復(fù)問題、H5加速問題),除了應(yīng)該有高效、核心的系統(tǒng)解決方案,還應(yīng)該提供方便的工具鏈,以提升使用及開發(fā)效率。

一、如何讓npm安裝時(shí)將此命令安裝到系統(tǒng)路徑?
在項(xiàng)目的package.json中,創(chuàng)建“bin”這個(gè)key, 然后你要聲明的命令及加載執(zhí)行文件的路徑,如:


image.png

基中, "apub"就是我的命令名稱,“bin/apub”,會在當(dāng)前項(xiàng)目的bin目錄下尋找apub這個(gè)文件。當(dāng)然這里的目錄和名字都可你自己定義。
當(dāng)我執(zhí)行npm install完成安裝后,apub會被安裝到系統(tǒng)nodejs的一個(gè)bin目錄下(這個(gè)目錄已被聲明到$PATH變量),我們就可在命令行中使用它了。

我的項(xiàng)目下bin目錄的內(nèi)容:


image.png

其中bin/apub只是引用相同目錄下的index.js:

#!/usr/bin/env node
require('./index.js');

關(guān)于package.json文件的更多配置項(xiàng)說明可參考:https://docs.npmjs.com/files/package.json#bin

二、如何解析命令行參數(shù)?
這里推薦commander這個(gè)解析庫,自己去寫還是要花很多時(shí)間的。這個(gè)庫提供了非常方便地添加參數(shù)并解析的方式。

const program = require('commander')
const chalk = require('chalk')

 program
    .version(require('../package').version, '-v, --version')
    .usage('<command> [options]')

program
    .command('server <file>')
    .description('create http server to allow downloading a file by scanning qr-code')
    .action((name, cmd) => {
        let apubServer = require('../lib/command/server')
        apubServer.onServer(name) // 此處根據(jù)傳入?yún)?shù)解析結(jié)果,將執(zhí)行轉(zhuǎn)到了onServer這個(gè)方法
    })
program.on('--help', () => {
    console.log()
    console.log(`  Run ${chalk.cyan(`apub <command> --help`)} for detailed usage of given command.`)
    console.log()
})

program.parse(process.argv)

文中chalk庫,能夠?qū)敵龅綐?biāo)準(zhǔn)輸出的文字定制樣式。

三、如何將內(nèi)容生成二維碼?
這里用到了qrcode-terminal這個(gè)庫,將需要供掃碼下載的文件,提供局域網(wǎng)內(nèi)下載服務(wù),將下載鏈接生成二維碼打印即可:

const qrcodeTerminal = require('qrcode-terminal')
console.log(`\n${chalk.white("文件下載地址:" + downloadUrl)}`)
qrcodeTerminal.generate(downloadUrl) // 生成并打印二維碼
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,267評論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,677評論 19 139
  • “我成功申請到出國留學(xué)的名額了”,電話那頭的人說道。我的第一個(gè)反應(yīng)是“很好啊,聽說學(xué)金融的出國留學(xué),會有更好的發(fā)現(xiàn)...
    不歪小姐閱讀 814評論 0 1
  • Howtogetasolution? 我們所做的topic,一般有幾個(gè)階段: Analysis:分析問題,找到問題...
    hzyido閱讀 768評論 0 3
  • 昨天中午,我用巧克力豆泡巧克力水,又放了一些巧克力豆,然后就放到了冰箱里,等著巧克力棒冰完成! 今...
    張瑞格閱讀 295評論 0 3

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