用nodejs开发npm命令行工具就这么简单(nodejs 命令行工具)

用nodejs开发npm命令行工具就这么简单(nodejs 命令行工具)

Node.js盛行了也有些年头儿了,相信很多前端工程师、全栈工程师也都用它编写过服务器端程序,实现过即时通讯。今天我们一起来聊聊如何用Node.js编写命令行工具,其实之前盛行的前端脚手架 glup.js就是用node.js编写的。

今天我们就用一起来编写一个添加时间戳工具,来体验一下。

先体验一下在线的成品:https://www.npmjs.com/package/timestamp007

厚积薄发,首先来我们先熟悉一下开发命令行工具需要用的模块和常见的命令格式。

1.需要用的模块:

commander 模块

  • 用途 :解析命令行参数
  • 主页: https://tj.github.io/commander.js/

fs 模块

  • 用途 :于对系统文件及目录进行读写操作

2.命令格式

编写命令行工具前,首先定义命令的使用方式:

如:

  • 项目文件目录下 $ timestamp action 表示项目下所有页面将添加时间戳
  • 给某个页面添加时间戳 $ timestamp action /project/index.html
  • 在非项目录下运行 需要制定项目目录 $ timestamp action /Users/river/web

3.常见的命令格式

command [options] [arguments]

含义如下:

  • command:命令名称,如:node,timestamp
  • options:–单词或者单字母,比如–help 或者 –h
  • arguments :参数

在查看命令帮助时会出现 [],<>,| 等符号,他们的含义分别是

  • []:可选
  • <>:表示可变选项。一般是多选一。而且是必选其中一个。
  • X|Y|Z 多选一,如果加上[],则可不选。
  • -abc:多选,如果加上[], 则可不选。

如 timestamp 命令的使用方法描述如下:

Usage: timestamp [options] [command]

接下来,我们一步步来创建我们的命令行项目:

1.首先 创建一个空的项目文件夹,然后再通过npm init 来初始化 package.json 文件夹:

$ mkdir timestamp

$ cd timestamp

$ npm init

2.初始化完毕后

安装commander模块:

$ npm install commander –save;

安装 fs模块:

$ npm install fs –save

3.安装完毕后

新建文件bin/timestamp;

文件代码如下:

#!/usr/bin/env nodevar progarm = require(\’commander\’);//命令版本号progarm.version(\’0.0.1\’);//help命令progarm .command(\’help\’) .description(\’显示使用帮助\’) .action(function(){ progarm.outputHelp(); });progarm .command(\’action [dir]\’) .description(\’加时间戳\’) .action(require(\’../lib/readfile\’)) .action(function(dir){ console.log(\”极客出品\”) }); //开始解析命令 progarm.parse(process.argv)

文件的第一行:

#!/usr/bin/env node :指定当前文件使用哪个解释器来执行。

progarm

.command(\’help\’)

.description(\’显示使用帮助\’)

.action(function(){

progarm.outputHelp();

});

  • command(\”help\”)表示当前是什么命令
  • .description(\’显示使用帮助\’) 当前的命令
  • .action(callback);解析到当前命令执行的回调函数
  • progarm.parse(process.argv)开始解析命令

4.编写readfile.js

在timestamp 目录下

$ mkdir lib

cd lib

新建 readfile.js,文件内容如下:

var fs = require(\’fs\’); //调用fs模块module.exports = function (dir) { //传入的目录,如果没有参数,则默认为当前目录 dir = dir || \’.\’; if (dir.indexOf(\”.html\”) > 0) { addtimestimp(dir); //如果参数是.html文件 } else { fs.readdir(dir, function (err, files) { //如果不是html文件则遍历文件夹下所有的.html文件 if (err) { console.log(err) } else { files.forEach(function (index) { var path = dir \”/\” index; if (index.indexOf(\’.html\’) > 0) { addtimestimp(path); } }) } }) }};function addtimestimp(path){ fs.readFile(path, \’utf-8\’, function (err, data) { //读取文件内容 if (err) { console.log(err) } else { var nowtime = Date(); var timestamp = Date.parse(nowtime); //以当前时间创建时间戳 var newcss = \”.css?t=\” timestamp; var testcss = /[.]{1}css(?t=[0-9]{0,})?/g; var newjs = \”.js?t=\” timestamp; var testjs = /[.]{1}js(?t=[0-9]{0,})?/g; var newpng = \”.png?t=\” timestamp; var testpng = /[.]{1}png(?t=[0-9]{0,})?/g; var newjpg = \”.jpg?t=\” timestamp; var testjpg = /[.]{1}jpg(?t=[0-9]{0,})?/g; var newdata = (((data.replace(testcss, newcss)).replace(testjs, newjs)).replace(testpng, newpng)).replace(testjpg, newjpg); fs.writeFile(path, newdata, function (err) { //增加时间戳后写入 if (err) { console.log(err); } else { console.log(path \”加时间戳完成\”) } }); } })}

5.编辑package.json

{ \”name\”: \”timestamp007\”, \”version\”: \”0.0.6\”, \”description\”: \”add a timestamp to the html files\”, \”main\”: \”index.js\”, \”scripts\”: { \”test\”: \”echo \”Error: no test specified\” && exit 1\” }, \”author\”: \”river.cao\”, \”license\”: \”ISC\”, \”bin\”: { \”timestamp\”: \”./bin/timestamp\” }, \”repository\”: { \”type\”: \”git\”, \”url\”: \”https://github.com/caojiangtao/timestamp\” }, \”dependencies\”: { \”commander\”: \”^2.9.0\”, \”fs\”: \”0.0.2\” }}

可以看到 package.json 增加了 bin属性,那么bin 属性的作用是什么呢?

bin 属性用来指定当前模块需要连接的命令,在这里我们指定了 timestamp 命令是执行文件 :

./bin/timestamp

重点来了为了让这个设置生效,还需要执行以下命令来进行连接

$ sudo npm link

那么执行完毕了,我就可以验证命令行是否生效了,

接下来执行:

$ timestamp help

如果看到如下内容:

Usage: timestamp [options] [command] Commands: help 显示使用帮助 action [dir] 加时间戳 Options: -h, –help output usage information -V, –version output the version number

表示我们的命令行编写成功了!

大功告成了!可以开一瓶82年的雪碧庆祝下了!!!

等等,我觉的还是要发布到npm给兄弟们共享下劳动成果的,

那么怎么发布到NPM上呢?

首先你的有个NPM的账号吧

1.注册 NPM 账号

$ npm adduser Username:river.caoPassword:Email:river@gmail.com

2.回到 timestamp 根目录 执行 npm publish ,如果没有错误提示那么就发布成果了,去 http://search.npmjs.org/上看一下吧,你的模块应该已经显示在”Latest Updates”一栏里了。(当然肯出会错,因为模块名称已经被占用了)

3.$ npm login //如果已经有账号。可以用login命令重新登录npm

那么 nodejs 的命令行开发已经讲完了,可以去喝雪碧了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2023年4月28日 上午10:54
下一篇 2023年4月28日 上午11:10

相关推荐

  • 公司管理流程软件

    公司管理流程软件 随着商业竞争的日益激烈,公司管理流程软件成为了现代企业管理中不可或缺的一部分。一个好的管理流程软件可以帮助公司优化流程,提高效率,降低成本,提高客户满意度。本文将…

    科研百科 2024年9月30日
    22
  • 专业速览 – 汉语言文学(教育部拔尖计划实验班)(汉语言文学拔尖班考试题)

    汉语言文学 (教育部拔尖计划实验班) 四年制本科/授文学学士学位 专业简介 汉语言文学(教育部拔尖计划实验班)建立在国家一流专业汉语言文学专业、汉语国际教育专业的基础上,依托教育部…

    科研百科 2024年4月15日
    309
  • 教务管理系统项目图片

    教务管理系统项目图片 教务管理系统是一种用于管理学校教学和教务活动的软件系统。它可以帮助学校更好地组织和管理教学和学习活动,提高教学质量和效率。下面我们将介绍一个教务管理系统的项目…

    科研百科 2024年12月20日
    0
  • 协同办公软件免费

    协同办公软件免费:让工作更高效 随着数字化时代的到来,协同办公软件已经成为了现代办公中不可或缺的一部分。这些软件可以帮助我们更好地协作,提高工作效率,但是它们的使用费用却常常让我们…

    科研百科 2024年9月19日
    26
  • 项目管理看板工具

    项目管理看板工具是一种用于管理和跟踪项目进度的工具,能够帮助项目经理更好地了解项目的进展情况,并与其他团队成员保持沟通。本文将介绍项目管理看板工具的基本概念、优点和使用方法。 项目…

    科研百科 2024年9月27日
    19
  • 系统落地项目管理

    系统落地项目管理 随着信息技术的不断发展,越来越多的系统和应用程序被开发出来,这些系统和应用程序的落地也成为了项目管理中的一个重要任务。在系统落地项目管理中,需要考虑许多因素,包括…

    科研百科 2024年12月11日
    0
  • 我的项目管理方法论(项目管理 方法论)

    做好项目管理,对于每个职场人来说,都是一件很重要的事情。本文作者结合自己3年的工作经验,梳理了一套自己的方法论,并将这套方法论分享给大家,希望能够有所帮助~ 为什么会写这篇文章? …

    科研百科 2024年2月18日
    119
  • 平泉推行村党组织书记“五定”星级化管理

    河北日报讯(记者尉迟国利 通讯员梁玉杰)平泉市推行“党委定标准、书记定承诺、履职定实绩、考评定星级、星级定报酬”的“五定”星级化管理机制,有力地激发了村党组织书记干事创业、担当作为…

    科研百科 2023年2月10日
    268
  • 智慧农贸市场管理软件(智慧农贸市场管理软件(包租婆))

    智慧农贸市场管理软件是一套专门针对农贸市场摊位出租管理而开发的综合性管理系统,软件可对农贸市场中的摊位管理、租户管理、租赁合同管理、收费管理、开票管理、报修管理等实现综合管理。 包…

    科研百科 2024年4月23日
    114
  • 会泽县综合行政执法局

    会泽县综合行政执法局会泽县综合行政执法局关于学生的工作范围内的情况,这里会涉及到校园的历史、文物、地理、活动、协调等方面。会长因选择某一个工作领域的事情而犯下严重的错误,可能会出现…

    科研百科 2024年11月20日
    0