用 node 写一个命令行工具,全局安装可用

现在,不管是前端项目还是 node 项目,一般都会用 npm 做包管理工具,而 package.json 是其相关的配置信息。

对 node 项目而言,模块导出入口文件由 package.json 的 main 字段指定,而如果是要安装到命令行的工具,则是由 package.json 的 bin 字段指定。

配置命令

配置单个命令

这样安装的命令名称是 pro:

{"name": "pro-cli","bin": {"pro": "bin/pro.js"}
}
配置多个命令

这样安装就有 pro 与 mini 两个命令:

{"name": "pro-cli","bin": {"pro": "bin/pro.js","mini": "bin/mini.js"}
}

对应 bin/pro.js 文件的写法:

#!/usr/bin/env noderequire('../lib/pro');

与普通的 js 文件写法一样,只是前面要加上 #!/usr/bin/env node

这段前缀代码叫 shebang,具体可以参考 Shebang (Unix) - Wikipedia).

安装方式

全局安装
npm i -g pro-cli

这种安装方式可以在命令行全局使用:

pro devpro build

本地安装:

npm i --save-dev pro-cli

这种安装方式需要配合 npm 一起使用,比如:

# package.json
{"scripts": {"dev": "pro dev","build": "pro build"}
}# 使用
npm run dev
npm run build

选择合适的命令行封装库:

一般来说,一个命令都会有如下的一些参数:

-v, --version 或 -V, --version: 查看版本号
-h, --help: 查看帮助信息

如果完全自己来写的,就会很麻烦,尤其是帮助信息。所以,选择一个好的命令行封装库,能够帮我们省去很多工作。用的比较多的:

commander.js:https://github.com/tj/commander.js
yargs:https://github.com/yargs/yargs
meow:https://github.com/sindresorhus/meow

以 commander.js 为例:

npm install commander --save

在 bin/pro.js中注册:

const commander = require('commander');

注册版本号与描述

commander.version('0.0.1').description('A cli application named pro');

注册参数(非子命令参数)

commander.option('-p, --peppers', 'Add peppers').option('-P, --pineapple', 'Add pineapple').option('-b, --bbq-sauce', 'Add bbq sauce').option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')

注册子命令

commander.command('rm <dir>').option('-r, --recursive', 'Remove recursively').action((dir, cmd) => {console.log('remove ' + dir + (cmd.recursive ? ' recursively' : ''))})

解析

commander.parse(process.argv);

 

安装后使用

查看版本号

pro -V
pro --version# 打印结果
0.0.1

运行 rm 子命令:

pro rm dir

查看帮助(commander 会自动生成) 

pro -h
pro --help# 打印结果
Usage: pro [options]A cli application named proOptions:-h, --help           output usage information-V, --version        output the version number-p, --peppers        Add peppers-P, --pineapple      Add pineapple-b, --bbq            Add bbq sauce-c, --cheese <type>  Add the specified type of cheese [marble]-C, --no-cheese      You do not want any cheese

常用的命令行相关工具库

chalk:

让命令行的字符带上颜色:GitHub - chalk/chalk: 🖍 Terminal string styling done right

 

Inquirer.js:

让命令行与用户进行交互,如输入、选择等:GitHub - SBoudrias/Inquirer.js: A collection of common interactive command line user interfaces.

shelljs:

跨平台 Unix shell 命令 的 node 封装:GitHub - shelljs/shelljs: :shell: Portable Unix shell commands for Node.js

ShellJS 是在 Node.js API 之上的 Unix shell 命令的可移植(Windows/Linux/macOS)实现。您可以使用它来消除 shell 脚本对 Unix 的依赖,同时仍然保留其熟悉和强大的命令。您还可以在全球范围内安装它,这样您就可以从 Node 项目外部运行它——告别那些粗糙的 Bash 脚本!

var shell = require('shelljs');if (!shell.which('git')) {shell.echo('Sorry, this script requires git');shell.exit(1);
}// Copy files to release dir
shell.rm('-rf', 'out/Release');
shell.cp('-R', 'stuff/', 'out/Release');// Replace macros in each .js file
shell.cd('lib');
shell.ls('*.js').forEach(function (file) {shell.sed('-i', 'BUILD_VERSION', 'v0.1.2', file);shell.sed('-i', /^.*REMOVE_THIS_LINE.*$/, '', file);shell.sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, shell.cat('macro.js'), file);
});
shell.cd('..');// Run external tool synchronously
if (shell.exec('git commit -am "Auto-commit"').code !== 0) {shell.echo('Error: Git commit failed');shell.exit(1);
}

blessed-contrib:

命令行图表:https://github.com/yaronn/blessed-contrib

cash:

跨平台 linux 命令 的 node 封装。与 shelljs 功能差不多:GitHub - dthree/cash: Cross-platform Linux commands in ES6

 

prompts:

又一个让命令行与用户进行交互的工具,与 Inquirer.js 功能差不多:GitHub - terkelg/prompts: ❯ Lightweight, beautiful and user-friendly interactive prompts

ora:

命令行加载中图标

GitHub - sindresorhus/ora: Elegant terminal spinner

progress:

命令行进度条:GitHub - visionmedia/node-progress: Flexible ascii progress bar for nodejs

downloading [=====             ] 39/bps 29% 3.7s

更多node惊艳的项目:GitHub - sindresorhus/awesome-nodejs: :zap: Delightful Node.js packages and resources 

比较常用的命令行 APP

命令行相关的应用就很多啦,比如 babel、webpack、rollup、eslint 等,但这些不仅仅是命令行工具。下面介绍一些纯命令行应用:

vtop: 美美的 linux top 命令界面
speed-test: 测试网络链接速度
http-server: 零配置启动一个 http 服务器
fkill-cli: 跨平台 kill 命令

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/6903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【高阶数据结构(一)】并查集详解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:高阶数据结构专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Go语言知识   &#x1f51d;&#x1f51d; 高阶数据结构 1. 前言2. 并查集…

等保2.0有哪些好处,到底要花多少钱?今天一个文章给你讲透

自从等保2.0相关标准正式发布以来&#xff0c;等级保护测评已然成为网络安全行业的热门话题&#xff0c;这意味着等保进入了一个全新的高度。 目前一些机构国家单位项目都有等保资质这一项&#xff0c;早做的客户符合这一标准&#xff0c;竞争项目就更有把握了。 第一次做完等…

数据分析的统计推断

数据分析的统计推断 前言一、提出问题二、统计归纳方法三、统计推断四、统计推断步骤如何进行统计推断统计推断的基本问题点估计区间估计总体方差已知总体方差未知 假设检验假设检验的假设显著性水平 五、检验统计量常见的检验统计量 六、检验方法七、拒绝域八、假设检验步骤九…

【JavaEE网络】从数据链路层到应用层的DNS

目录 数据链路层以太网 DNS 数据链路层 越往下与程序员越远 代表协议&#xff1a;以太网。平常用的网线也叫“以太网线”&#xff0c;平常用的交换机也叫“以太网交换机” 以太网 认识以太网 “以太网” 不是一种具体的网络&#xff0c;而是一种技术标准&#xff1b;既包含…

Day19 代码随想录打卡|字符串篇---反转字符串II

题目&#xff08;leecode T541&#xff09;&#xff1a; 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。如果剩余字符小…

基于uniapp+vue3+vite实现小程序构建Android、iOS多端项目配置详解

&#x1f680; 作者 &#xff1a;“二当家-小D” &#x1f680; 博主简介&#xff1a;⭐前荔枝FM架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人&#xff0c;8年开发架构经验&#xff0c;精通java,擅长分布式高并发架构,自动化压力测试&#xff0c;微服务容器化k…

网络驱动--汽车ETNB(瑞萨)

以太网AVB (ETNB) 介绍RH850/U2A-EVA的属性&#xff0c;如编号 单元、寄存器的基址。描述了函数和寄存器 ETNB的成员。 两个单元&#xff1b;Units ▪ Fast Ethernet ETNB0 ▪ Gigabit Ethernet ETNB1 单元通道特点 For ETNB0 (Fast Ethernet) ▪ Communication interface ▪…

基于 llama2 的提示词工程案例2

优化大型语言模型&#xff08;LLMs&#xff09; 优化大型语言模型&#xff08;LLMs&#xff09;中的提示词&#xff08;prompts&#xff09;是提高模型性能和输出相关性的重要手段。以下是一些优化提示词的方向&#xff1a; 明确性&#xff1a;确保提示词清晰明确&#xff0c;…

Rust 实战thiserror+自定义错误消息体

导航 一、背景二、实践1、导入thiserror2、自定义错误消息体&#xff08;1&#xff09;创建ErrMsg.rs和创建自定义结构体&#xff08;2&#xff09;lib.rs添加ErrMsg&#xff08;3&#xff09;main函数&#xff08;4&#xff09;完整代码 一、背景 开发中遇到需要通用、能够满…

LeetCode 142.环形链表Ⅱ

题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内…

速卖通自养号测评技术策略与实战指南

速卖通自养号测评是一个涉及多个步骤和细节的过程&#xff0c;以下是一些关键步骤和注意事项&#xff1a; 1. 准备资源和环境&#xff1a; 测评养号系统&#xff1a;确保账号的权重稳定运营与账号便捷的管理。 海外纯净IP资源&#xff1a;为账号提供稳定的网络环境&#x…

AI新突破:多标签预测技术助力语言模型提速3倍

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享&#xff0c;与你一起了解前沿深度学习信息&#xff01; 引言&#xff1a;多标签预测的新视角 在人工智能领域&#xff0c;尤其是在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;预测模型的训练方法一直在…

地下管线管网三维参数化建模软件MagicPipe3D V3.5

经纬管网建模系统MagicPipe3D&#xff08;www.magic3d.net&#xff09;自主安全可控&#xff0c;本地离线参数化构建三维管网模型&#xff08;管道、接头、附属物等&#xff09;&#xff0c;输出标准3DTiles、Obj等格式&#xff0c;支持Cesium、Unreal、Unity等引擎可视化查询分…

【mysql】深入探索mysql中的各种约束条件

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Java | Spring框架 | Bean的装配之XML配置

Spring | Bean的装配 之XML配置 在Spring框架中&#xff0c;Bean的装配是指将Bean定义和配置信息加载到Spring容器中&#xff0c;以便容器能够管理这些Bean。 Spring支持多种装配方式&#xff0c;其中XML配置是传统但依然有效的方式。 一、 使用XML配置文件定义Bean XML配置…

知识图谱和大语言模型的共存之道

导读 知识图谱和大型语言模型都是用来表示和处理知识的手段。大模型补足了理解语言的能力&#xff0c;知识图谱则丰富了表示知识的方式&#xff0c;两者的深度结合必将为人工智能提供更为全面、可靠、可控的知识处理方法。在这一背景下&#xff0c;OpenKG组织新KG视点系列文章—…

还有谁……想知道“线下与线上布局之间的本质区别”

还有谁……想知道 线下与线上布局之间的本质区别 hello,亲爱的你们好.… 我是你们的好朋友,正博,今天是非常特殊的一天,给每一位读者准备了一份特殊的神秘礼物…… 在分享【特殊礼物】之前,请允许我分享一下《线下营销与线上销售的9大核心差异》…… 1、注意力; 2、销…

浪漫编码:手把手教你实现校园表白墙功能

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;浪漫编码&#xff1a;手把手教你实现校园表白墙功能 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 这里写目录标题 表白墙数据准备引入MyBatis和MySQL驱动依赖…

华为OD机试【路灯照明问题】(java)(100分)

1、题目描述 在一条笔直的公路上安装了N个路灯&#xff0c;从位置0开始安装&#xff0c;路灯之间间距固定为100米。 每个路灯都有自己的照明半径&#xff0c;请计算第一个路灯和最后一个路灯之间&#xff0c;无法照明的区间的长度和。 2、输入描述 第一行为一个数N&#xff…