nodejs开发命令行工具

一个简单的 Node.js CLI 工具的开发流程

开发一个命令行工具(CLI)是一个非常有用的技能,Node.js 提供了强大的库和模块来帮助你快速构建 CLI 应用。下面是一个简单的指南,教你如何使用 Node.js 开发一个命令行工具。

第一步:初始化项目

#创建项目目录‌:
mkdir my-cli-tool
cd my-cli-tool
#‌初始化 npm 项目‌:
npm init -y

第二步:创建入口文件

通常,CLI 工具的入口文件是 cli.js 或 index.js。在这个例子中,我们将使用 cli.js。

touch cli.js

第三步:编写 CLI 代码

在 cli.js 中,我们将使用 Node.js 的内置模块 commander 和 inquirer 来解析命令行参数并进行交互。

‌安装依赖‌:

npm install commander inquirer

‌编辑 cli.js‌:

#!/usr/bin/env nodeconst { Command } = require('commander');
const inquirer = require('inquirer');const program = new Command();
program.version('1.0.0');program.option('-n, --name <type>', 'Your name').option('-a, --age <type>', 'Your age', parseInt);program.parse(process.argv);const options = program.opts();if (!options.name || !options.age) {console.log('Please provide both name and age.');program.help();
} else {(async () => {const answers = await inquirer.prompt([{type: 'confirm',name: 'confirm',message: `Are you sure you want to continue with Name: ${options.name}, Age: ${options.age}?`,default: true}]);if (answers.confirm) {console.log(`Hello, ${options.name}! You are ${options.age} years old.`);} else {console.log('Operation cancelled.');}})();
}

第四步:更新 package.json

在 package.json 中,添加一个 bin 字段来指定 CLI 工具的入口文件:

{"name": "my-cli-tool","version": "1.0.0","main": "cli.js","bin": {"my-cli-tool": "./cli.js"},"scripts": {// ...},"dependencies": {"commander": "7.2.0","inquirer": "8.1.0"}
}

第五步:全局安装你的 CLI 工具

‌在本地链接你的包‌(仅用于开发测试):

npm link

‌现在你可以在命令行中使用 my-cli-tool‌:

my-cli-tool -n John -a 30

第六步:发布到 npm(可选)

如果你希望将你的 CLI 工具发布到 npm,以便其他人也可以使用,你需要:

‌创建一个 npm 账户‌(如果你还没有)。

#‌登录 npm‌:
npm login
#‌发布你的包‌:
npm publish

总结

以上是一个简单的 Node.js CLI 工具的开发流程。你可以根据需要添加更多的功能和复杂的逻辑,使用更多的 npm 包来增强你的 CLI 工具。希望这个指南对你有所帮助,祝你开发顺利!

Npm link

npm link 是 Node.js 的包管理工具 npm 中的一个命令,它主要用于在本地开发环境中创建一个符号链接(symbolic link),使得你可以在本地项目中直接测试和引用另一个本地项目或模块,而无需将其发布到 npm 仓库。

使用场景

‌开发依赖模块‌:当你在开发一个 Node.js 项目时,可能同时也在开发一个依赖模块。使用 npm link 可以让你在开发过程中实时地测试这个依赖模块,而不必每次都发布新版本到 npm 仓库。

‌模块测试‌:在发布模块到 npm 仓库之前,你可能希望在多个项目中测试它。npm link 提供了一种便捷的方式来做到这一点。

使用方法

npm link 的使用通常分为两个步骤:

‌在模块项目中运行 npm link‌:

进入到你想要被链接的模块项目目录。
运行 npm link 命令。
这会在全局 npm 目录中创建一个符号链接指向你的模块项目。

‌在项目中使用链接的模块‌:

进入到你的主项目目录(即你想要使用链接模块的项目)。
运行 npm link <模块名> 命令。
这会在你的项目的 node_modules 目录中创建一个符号链接,指向你之前链接的模块项目。
示例

假设你有两个项目:一个是名为 my-module 的模块项目,另一个是名为 my-app 的应用项目,并且 my-app 依赖于 my-module。

在 my-module 项目目录中运行:

npm link

然后在 my-app 项目目录中运行:

npm link my-module

这样,my-app 项目中的 node_modules/my-module 就会是一个指向 my-module 项目目录的符号链接。当你在 my-module 项目中进行更改时,这些更改会立即反映在 my-app 项目中,因为它们是直接链接的。

取消链接

如果你想取消这种链接关系,可以在 my-app 项目目录中运行:

npm unlink my-module

这将会删除 node_modules/my-module 目录中的符号链接,但不会删除 my-module 项目中的全局链接。如果你想完全移除全局链接,可以在 my-module 项目目录中运行:

npm unlink

npm link 是开发过程中一个非常有用的工具,特别是当你需要在多个项目之间共享和测试代码时。

package.json配置文件中bin字段的作用

在 package.json 配置文件中,bin 字段用于指定一组可执行的文件映射。使用 bin 字段可以显著简化命令行工具的使用,它为开发者提供了一种方便的方式来公开和分发他们的 Node.js 脚本。用户可以直接从命令行运行这些脚本,而不需要知道它们的实际文件路径。这个字段的作用主要体现在以下几个方面:

全局安装时创建符号链接‌:

当一个包被安装为全局包时(使用 npm install -g),npm 会为 bin 字段中指定的可执行脚本创建符号链接(symlinks)到全局安装目录下的 bin 目录。这样,用户就可以在命令行中直接使用这些命令,而不需要指定完整的路径。

本地安装时创建符号链接‌:

当一个包作为项目的依赖被安装时(使用 npm install),npm 会将这些可执行脚本的符号链接创建在本地的 node_modules/.bin/ 目录下。这样,在项目的上下文中,可以通过 node_modules/.bin/ 路径或者通过 npm 提供的脚本来执行这些命令。

简化命令行工具的使用‌:

在 bin 字段中,你可以指定可执行文件的名称以及它们对应的脚本文件路径。如果只需要提供一个可执行文件,并且希望命令名与包名相同,你可以简化配置,直接指定文件的路径作为 bin 的值。在这种情况下,命令的名称默认会使用包名。

这一功能被广泛用于各种流行的 Node.js 工具中,如 npm、webpack、mocha 等。这些工具都通过 package.json 文件中的 bin 字段来提供命令行接口,使得用户能够方便地执行各种任务。

综上所述,bin 字段在 package.json 配置文件中扮演着至关重要的角色,它使得 Node.js 包能够轻松地提供命令行工具,并简化用户的使用过程。

bin字段的使用示例

以下是一个 bin 字段在 package.json 文件中使用的简单示例:
假设你创建了一个叫做 my-cli-tool 的 Node.js 包,并且你想要用户可以通过名为 mytool 的命令来运行它。你的 package.json 文件可能会包含如下配置:

{"name": "my-cli-tool","version": "1.0.0","bin": {"mytool": "./bin/mytool.js"},// 其他配置...
}

在这个例子中:

bin 字段是一个对象。
对象的键(“mytool”)是用户在终端中调用的命令名。
对象的值(“./bin/mytool.js”)是相对于 package.json 文件的可执行脚本的路径。

配置完成后,当用户全局安装你的包(运行 npm install -g my-cli-tool)时,npm 将会自动创建必要的符号链接。之后,用户可以通过简单地键入 mytool 来执行 ./bin/mytool.js 文件(而不必指定完整路径)。

如果你只需要提供一个可执行文件,并且希望命令名与包名相同,你可以简化 bin 字段的配置,如下所示:

{"name": "my-cli-tool","version": "1.0.0","bin": "./bin/mytool.js",// 其他配置...
}

在这个简化的配置中,命令的名称默认会使用包名 my-cli-tool。

请注意,为了让这个示例正常工作,你的项目目录中应该有一个名为 bin 的子目录,并且该子目录中应该包含一个名为 mytool.js 的可执行脚本文件。这个脚本文件应该包含你想要用户通过命令行执行的代码。

有哪些常用的Node.js CLI库?

Node.js 生态系统中有许多常用的 CLI(命令行界面)库,这些库可以帮助开发者构建功能强大的命令行工具。以下是一些常用的 Node.js CLI 库:

Commander.js‌:

这是一个功能强大的命令行工具库,用于解析命令行参数、生成帮助文本和管理错误。它类似于 Python 的 argparse,使得编写命令行界面变得简单和高效。

Inquirer.js‌:

这是一个用于收集用户输入的库,它提供了多种类型的提示(如输入、选择、确认等),使得 CLI 工具可以与用户进行交云互动。

Chalk‌:

这是一个用于在终端中输出彩色文本的库,它使得 CLI 工具的输出更加生动和易于区分。

‌Yargs‌:

这是一个用于解析命令行参数的库,它提供了灵活的配置选项和强大的插件系统,使得处理复杂的命令行参数变得简单。

‌Figlet‌:

这是一个用于生成 ASCII 艺术的库,它可以在 CLI 工具的输出中添加有趣的图形或文字效果。

‌Clear‌:

这是一个用于清空终端屏幕的库,它可以在 CLI 工具中提供更好的用户体验。

‌Clui‌:

这是一个用于在命令行中绘制 UI 组件的库,如表格、仪表盘、加载指示器等。

Ora‌:

这是一个用于在命令行中显示加载指示器的库,它提供了多种样式和配置选项。

‌Cross-env‌:

这是一个用于设置环境变量的库,它使得脚本能够在不同的操作系统上兼容运行。

Rimraf‌:

这是一个用于删除文件和文件夹的库,类似于 Unix/Linux 的 rm -rf 命令。

这些库只是 Node.js CLI 生态系统中的一部分,根据你的具体需求,你可能还会用到其他库。选择合适的库可以极大地提高你的开发效率和 CLI 工具的功能性。

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

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

相关文章

WebRTC服务质量(09)- Pacer机制(01) 流程概述

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…

Linux高级--2.4.5 靠协议头保证传输的 MAC/IP/TCP/UDP---协议帧格式

任何网络协议&#xff0c;都必须要用包头里面设置写特殊字段来标识自己&#xff0c;传输越复杂&#xff0c;越稳定&#xff0c;越高性能的协议&#xff0c;包头越复杂。我们理解这些包头中每个字段的作用要站在它们解决什么问题的角度来理解。因为没人愿意让包头那么复杂。 本…

uniapp 微信小程序 数据空白展示组件

效果图 html <template><view class"nodata"><view class""><image class"nodataimg":src"$publicfun.locaAndHttp()?localUrl:$publicfun.httpUrlImg(httUrl)"mode"aspectFit"></image>&l…

BAPI_BATCH_CHANGE在更新后不自动更新批次特征

1、问题介绍 在CL03中看到分类特性配置了制造日期字段&#xff0c;并绑定了生产日期字段MCH1~HSDAT MSC2N修改批次的生产日期字段时&#xff0c;自动修改了对应的批次特性 但是通过BAPI&#xff1a;BAPI_BATCH_CHANGE修改生产日期时&#xff0c;并没有更新到批次特性中 2、BAPI…

Paddler负载均衡器

Paddler负载均衡器 Paddler本身是用Go语言编写的,没有直接的Python接口,但可以通过以下方式在Python中使用: 执行命令行调用 在Python中可以使用 subprocess 模块来调用Paddler的命令行工具,实现负载均衡功能 。例如: import subprocessdef start_paddler_agent():com…

数据仓库工具箱—读书笔记02(Kimball维度建模技术概述03、维度表技术基础)

Kimball维度建模技术概述 记录一下读《数据仓库工具箱》时的思考&#xff0c;摘录一些书中关于维度建模比较重要的思想与大家分享&#x1f923;&#x1f923;&#x1f923; 第二章前言部分作者提到&#xff1a;技术的介绍应该通过涵盖各种行业的熟悉的用例展开&#xff08;赞同…

Python中的logger作用(from loguru import logger)

文章目录 具体解释示例代码为什么使用 Loguru&#xff1f;常见使用场景总结 Loguru 是一个非常流行且易用的 Python 日志记录库&#xff0c; logger 是其主要的日志记录工具&#xff0c;用来记录程序运行中的信息&#xff0c;如调试信息、错误信息、运行状态等。 具体解释 Log…

视频汇聚融合云平台Liveweb一站式解决视频资源管理痛点

随着5G技术的广泛应用&#xff0c;各领域都在通信技术加持下通过海量终端设备收集了大量视频、图像等物联网数据&#xff0c;并通过人工智能、大数据、视频监控等技术方式来让我们的世界更安全、更高效。然而&#xff0c;随着数字化建设和生产经营管理活动的长期开展&#xff0…

linux 查看服务是否开机自启动

一、centos6查看开机自启服务 chkconfig rpcbind --list chkconfig 服务 --list 二、centos7查看开机自启服务 1.systemctl list-unit-files 查看启动项 左边是服务名称&#xff0c;右边是状态&#xff0c;enabled是开机启动&#xff0c;disabled是开机不启动 systemctl l…

MySQL连接IDEA(Java Web)保姆级教程

第一步&#xff1a;新建项目(File)->Project 第二步&#xff1a;New Project(JDK最好设置1.8版本与数据库适配&#xff0c;详细适配网请到MySQL官网查询MySQL :: MySQL 8.3 Reference Manual :: Search Results) 第三步&#xff1a;点中MySQLTest(项目名)并连续双击shift键-…

Kibana安装教程——Linux

Kibana安装教程——Linux 一、安装 下载安装包&#xff1a; 官网下载地址&#xff1a;https://www.elastic.co/cn/downloads/kibana 上传包到linux 切换到安装目录下 解压&#xff1a;tar -zxvf kibana-7.17.1-linux-x86_64.tar.gz 重命名安装文件夹 mv kibana-7.17.1-linux-x…

FreeSql

官网 实体特性 Ado 它包括所有对 SQL 操作的封装&#xff0c;提供 ExecuteReader、ExecuteDataSet、ExecuteDataTable、ExecuteNonQuery、ExecuteScalar 等方法&#xff0c;使用起来和传统 SqlHelper 一样。 1、安装包 dotnet add package FreeSql dotnet add package FreeSq…

linux下搭建lamp环境(dvwa)

lamp简介 LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写&#xff1a; Linux&#xff0c;操作系统 Apache&#xff0c;网页服务器 MariaDB或MySQL&#xff0c;数据库管理系统或数据库服务器 PHP、Perl或Python&#xff0c;脚本语言 # ubuntu安装…

React第十八节 useEffect 用法使用技巧注意事项详解

1、概述 useEffect 是React中一个用于 将组件与外部系统同步的 Hook&#xff1b;在函数式组件中处理副作用函数的 Hook&#xff0c;用于替代类式组件中的生命周期函数&#xff1b; 可以在副作用函数中 实现以下操作&#xff1a; a、请求接口&#xff0c;获取后台提供数据 b、操…

Linux高并发服务器开发 第六天(rwx 对于目录和文件的区别 gcc编译器 动态库静态库)

目录 1.rwx 对于目录和文件的区别 2.gcc 编译器 2.1编译过程 2.2gcc 的其他参数 3.动态库和静态库 3.1函数库 1.rwx 对于目录和文件的区别 r 文件的内容可以被查看。支持cat、more、head...vim &#xff1b;目录的内容可以被查看。ls、tree …

腾讯云云开发 Copilot 深度探索与实战分享

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 一、引言 二、产品介绍 三、产品体验过程 四、整体总结 五、给开发者的复用建议 六、对 AI 辅助开发的前景展望 一、引言 在当今数字化转型加速的时代&#xff0c;…

潮玩设备AI语音交互方案,ESP32-S3芯片模组物联网通信技术

在智能化的世界里&#xff0c;每一个设备都是一个节点&#xff0c;它们通过无线网络相互连接&#xff0c;形成一个庞大的智能网络。这些设备能够相互通信&#xff0c;理解并判断用户的需求&#xff0c;从而提供更加个性化的服务。 而这一切的背后&#xff0c;是强大的处理器和…

Jensen-Shannon Divergence:定义、性质与应用

一、定义 Jensen-Shannon Divergence&#xff08;JS散度&#xff09;是一种衡量两个概率分布之间差异的方法&#xff0c;它是Kullback-Leibler Divergence&#xff08;KL散度&#xff09;的一种对称形式。JS散度在信息论、机器学习和统计学等领域中具有广泛的应用。 给定两个概…

使用 Three.js 创建烟花粒子特效教程

使用 Three.js 创建烟花粒子特效教程 今天&#xff0c;我们将使用 Three.js 来实现一个简单而美观的烟花粒子效果。烟花会在屏幕随机位置生成&#xff0c;粒子在爆炸后呈现出散射、下降、逐渐消散的动态效果。先来看一下效果。 第一步&#xff1a;搭建基础场景 在正式实现烟花…

神经网络-VggNet

2014年VggNet被推出&#xff0c;获取了ILSVRC2014比赛分类项目的第二名&#xff0c;第一名是GoogleNet&#xff0c;该网络在下节介绍&#xff0c;本节主要介绍VggNet。 VggNet可以称为是一个家族&#xff0c;根据层数的不同包括了A、A-LRN、B、C、D等网络结构&#xff0c;其中…