问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何基于nodejs开发一个命令行工具

发布网友 发布时间:2022-04-23 17:37

我来回答

1个回答

热心网友 时间:2022-04-11 08:14

效果预览

实践

通过上面的gif演示,其实你已经读完了本文的所有内容:开发一个npm包,可以让所有人通过npm install命令安装,并且通过命令行直接运行相关指令,处理相应的事务。接下来我们就通过一个跟“Hello world”一样简单的示例,一起来学习。

包目录结构

“无规矩,不成方圆”,任何事物都有其必须遵守的规则。开发一个Npm包,最基本的原则就是需要一个包目录,并创建相应的包配置文件。如示例所示:我们开发了一个名为zwj的包,那么我们就把包目录定义为zwj,接着便可以进入zwj目录,创建名为package.json的包配置文件。命令如下:

mkdir zwj
cd zwj

然而,当我们创建配置文件的时候,为了确保内容与格式的准确性,建议使用npm内置的npm init命令来创建。执行命令后,根据提示一步一步完成操作即可。当然,如果你非要自己一项一项配置去敲,也不会有人拦着你。

初始化的package.json文件,可以满足我们开发普通包的所有需求,但是对于需要支持命令行操作的包,我们还需要做一些其他的补充。首先,需要在配置文件中增加bin配置,并绑定命令和脚本。而脚本对应的文件位置,可以是包的根目录,也可以是包中其他任意目录下的文件。参考了几个较为有名的npm包,建议将脚本位置放置在名为bin的目录中。

完成了这些之后,当然我们就该考虑实现我们的小工具的具体功能了,所以少不了要创建一些js文件。至此,我们的包目录结构至少应该像下面这样:

文件内容简述

有了前面的基础,接下来我们来逐个分析每个文件的内容,更加深入的去理解前面罗列信息。我们先来看一下配置文件的关键内容:

这是截取自package.json中的一部分,也是比较关键的一部分,这几个信息几乎是每个完整的npm包必填的配置。从上至下依次表示:包名、版本、包描述、主入口文件、bin【命令行不可少的配置字段】。

然后,我们看下示例中bin/zwj文件中的内容:

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

代码超级简单,总共就这么两行。当然我们也可以在这里书写复杂的逻辑,比如根据命令行参数,调用不同的执行脚本等等。简单解释下这两行代码,第一行是Unix/Linux的写法,简单的说就是告诉程序使用什么东西来解释下面的代码,此处就是告诉系统使用node来执行下面的代码。第二行就简单了,执行加载../zwj.js模块,并返回。也就是说,经过这行代码之后,我们的命令行小工具的具体功能就可以交给zwj.js这个文件去控制了。那么,zwj.js究竟做什么,那这个就要看开发者的意图了,先不管这个,我们先来看看示例代码中的zwj.js做了什么:

var fs = require('fs'),
   pwd = process.cwd();
console.log(fs.readdirSync(pwd));

如演示中所示,示例命令行工具的功能便是在控制台显示执行命令目录下的文件列表。process.cwd()得到的是当前执行命令目录的完整路径。

本地调试

至此,用Node.js开发一个命令行工具的内容就讲完了。但是程序开发往往不能一步到位,期间可能存在各种各样未知的不可预测的问题。这时候调试就显得尤为重要了,这也是为什么调试环节在任何一个程序开发项目中不可或缺的原因之一。在Windows下开发命令行工具的测试方式其实很方便,进入本地包根目录,执行:

npm install . -g

即可将本地正在开发的包,安装为全局包。而在执行以上命令的过程中,便会在npm全局包目录中生成命令行所需的cmd文件,本例生成zwj.cmd。生成的文件内容大致如下:

而在Unix/Linux中就更简单了,只需在包根目录执行npm link即可。

成功之后,我们就可以直接在命令行输入zwj命令,执行相应的功能了。当然,前提是npm全局包目录被添加到了path环境变量中。通常应该是这样的:

而当我们执行命令测试脚本发现问题后,我们在本地包中修改,完成后再次执行前面的安装代码便可以直接覆盖前一次安装,也可以先执行卸载命令:

npm uninstall -g zwj

然后再安装即可。

发布与升级

当我们的工具开发完成后,如何发布到社区,如何提供给其他开发者使用,这是我们的最后一步。npm包的发布很简单,原本只需要在包根目录执行:npm publish命令即可。但如果你是第一次发布应用,需要解决好账号登录的问题:先执行npm adser命令,依次输入用户名、密码和邮箱登录,然后通过npm whoami命令确认登录是否成功。万事俱备之后,再执行npm publish命令,你的包就可以发布到社区与众多开发者共享了!

最后,升级就简单了。本地增加好新的功能,测试通过之后,修改版本号之后,执行:npm publish等待完成即可。

PS:最好给每个包都增加一个README.md文件,写入包的作用,使用方法,更新日志等等。方便使用者查阅。完美~~

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
是选诺顿杀毒软件好还是NOD32好? 诺顿好还是NOD32好???请高手指点 诺顿安全软件和ESET NOD32安全软件相比,谁的防护.杀毒更强,功能更多... 诺顿和NOD32这两个杀毒软件哪个比较好? 什么是土地二次抵押 "口似含莲,乾姜之手"是什么意思? 乾姜的意思是什么 都说Pinnacle Food公司各方面做的好,有对这家了解的吗 空调蒸发箱多久清洗一次 空调蒸发箱需要清洗吗 苹果xr流量设置 nodejs 添加操作数据库怎么添加日志 如何在 NodeJs 上搭建 React 开发环境 nodejs文件上传为什么要在临时目录 nodejs检查文件是否含有mp4 node.js 中有没有类似 php 中 file nodejs 怎么打包成可执行文件 如何用nodejs打开项目中的html文件? nodejs fs怎么更改文件内容 如何使用nodejs的fs库来读写文件 nodejs为什么可以操作文件原理 如何找回回收站清空的照片? 回收站删除的照片怎么恢复? 刚买的车子,10万,买车险要多少钱 买了裸车16万保险一般多少钱 过年刚买了台新车,请问下新车车损险一般要多少钱? 请问新中国(1949年建国后)第一所私立学校建立于何时何地? 世博波兰馆的介绍 年底上海有什么好演出? 英国班戈大学的全面介绍。 南京长江大桥奠基仪式是哪一天? 主角穿越火影的小说,不要虐主,不要狗血, 火影之都天劫主小说txt全集免费下载 火影穿越小说主角是鸣人的哥哥或者是四代的弟弟或者是四代的好朋友。例如火影之闪光,火影之木叶之火,火 火影之白羽的主角简介 主角是四代火影的小说。 火影之邪帝降临(主角叫照空冥的)1-376章完整txt版本 图片勿发 火影之什么什么的男主同人小说 火影穿越小说主角会金遁,不是火影之信念和碧之眸 影流之主劫最像火影忍者里的哪个人物? 中国对垃圾分类有相关的政策制度吗? 分析我国实行垃圾分类制度,体现了哪些经济生活道理? 上海、北京、广州等城市相继实行垃圾分类,为什么各城市垃圾分类制度略有不同? 西安市垃圾分类有什么制度原则? 医院生活垃圾分类管理制度 垃圾分类的制度设计 政府在推行垃圾分类制度过程中应如何履职? 政府在推行垃圾分类制度过程中应如何履职? 王者荣耀中东皇太一的出装有哪些呢? 王者荣耀东皇太一用什么五级铭文好??? 东皇教官的出装铭文是?