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

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

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

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

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


2709508-e8b5076d58bb27e4.png
image.png

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

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


2709508-03d37bf46a259b8d.png
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) // 生成并打印二维码

猜你喜欢

转载自blog.csdn.net/weixin_34352005/article/details/87230890