如何用nodejs写一个像hap-toolkit那样的命令行工具

当前在移动端开发多个典型问题的系统解决方案中,常常用nodejs来帮助开发一套辅助工具,以便于使用或者调试。

我们在建设应用发布平台(热修复平台)的过程中,即用nodejs开发了一套apub工具(类似于快应用的hap-toolkit工具链),将本地编译输出结果,生成下载链接,以二维码的方式提供扫码下载。

移动开发的一些典型问题(如:热修复问题、H5加速问题),除了应该有高效、核心的系统解决方案,还应该提供方便的工具链,以提升使用及开发效率。

一、如何让npm安装时将此命令安装到系统路径?
在项目的package.json中,创建“bin”这个key, 然后你要声明的命令及加载执行文件的路径,如:


image.png

基中, "apub"就是我的命令名称,“bin/apub”,会在当前项目的bin目录下寻找apub这个文件。当然这里的目录和名字都可你自己定义。
当我执行npm install完成安装后,apub会被安装到系统nodejs的一个bin目录下(这个目录已被声明到$PATH变量),我们就可在命令行中使用它了。

我的项目下bin目录的内容:


image.png

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

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

关于package.json文件的更多配置项说明可参考:https://docs.npmjs.com/files/package.json#bin

二、如何解析命令行参数?
这里推荐commander这个解析库,自己去写还是要花很多时间的。这个库提供了非常方便地添加参数并解析的方式。

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) // 此处根据传入参数解析结果,将执行转到了onServer这个方法
    })
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库,能够对输出到标准输出的文字定制样式。

三、如何将内容生成二维码?
这里用到了qrcode-terminal这个库,将需要供扫码下载的文件,提供局域网内下载服务,将下载链接生成二维码打印即可:

const qrcodeTerminal = require('qrcode-terminal')
console.log(`\n${chalk.white("文件下载地址:" + downloadUrl)}`)
qrcodeTerminal.generate(downloadUrl) // 生成并打印二维码
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,235评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,092评论 19 139
  • “我成功申请到出国留学的名额了”,电话那头的人说道。我的第一个反应是“很好啊,听说学金融的出国留学,会有更好的发现...
    不歪小姐阅读 4,068评论 0 1
  • Howtogetasolution? 我们所做的topic,一般有几个阶段: Analysis:分析问题,找到问题...
    hzyido阅读 3,961评论 0 3
  • 昨天中午,我用巧克力豆泡巧克力水,又放了一些巧克力豆,然后就放到了冰箱里,等着巧克力棒冰完成! 今...
    张瑞格阅读 1,814评论 0 3

友情链接更多精彩内容