如何从0开始用node写一个自己的命令行程序


Posted in Javascript onDecember 29, 2018

前言

什么是命令行程序呢?像我们常见的webpack,vue-cli都属于命令行程序。

本文将带你从0开始用node写一个自己的命令行程序,并发布到npm。

准备工作

我打算写一个统计个人代码提交量的命令行工具,起名 git-tool

npm地址见git-tool ,GitHub地址见 git-tool 。

1、在GitHub上新建一个项目git-tool。

2、克隆到本地进行开发。

3、执行npm init创建package.json文件。

// 其他代码
"bin": {
  "git-tool": "./index.js"
},
// 其他代码

bin字段里面的key值可以随便取名,value值为对应的执行文件。

4、新建index文件。

#!/usr/bin/env node
console.log('git-tool')

#!/usr/bin/env node 的意思是让系统自己去找node的执行程序,该行必不可少。

5、执行 npm link

如果执行该命令报错,参考 https://docs.npmjs.com/getting-started/fixing-npm-permissio

6、运行 git-tool

我们发现控制台会打印出git-tool。

如何从0开始用node写一个自己的命令行程序

图一

实现

经过以上步骤我们已经基本搭好环境了,下面就可以开始写自己的逻辑了。

参数读取

process.argv 用来获取命令行参数。

修改index.js文件

#!/usr/bin/env node
console.log('git-tool')
console.log(process.argv)

然后执行 git-tool ss cd ,结果如下图所示:

如何从0开始用node写一个自己的命令行程序

图二

process.argv 返回一个数组,数组前两位是固定的,分别是node程序的路径和脚本存放的位置,从第三位开始才是额外输入的内容。

npm社区有一些优秀的命令行参数解析包,如 yargs , commander.js

我使用的是 commander.js

插件

commander.js 的基本使用很简单,

#!/usr/bin/env node
const program = require('commander');
program.version('1.0.0')
program
 .command('codeLineNum')
 .description('统计git提交代码量')
 .option("--author [author]", "统计指定作者git提交代码量")
 .action(function (options) {
  console.log(options.author)
 })
program.parse(process.argv);

此时执行 git-tool -h ,效果如下:

如何从0开始用node写一个自己的命令行程序

图三

它会帮我们自动做一些事情,很方便。

思路

我们要实现统计代码提交量的目的,就必须借助git命令。

git log --author="username" --pretty=tformat: --numstat

该命令输出如下:

如何从0开始用node写一个自己的命令行程序

图四

第一列为增加的代码行数,第二列为删除的代码行数,第三列为改动的文件。

一些管道命令符可以处理这些数据,但是Windows系统不支持。

所以我的思路是把数据写到文件中,然后在逐行读取进行处理。

代码

具体实现细节就不展开了,有兴趣的可以去GitHub看源码。

最终实现效果如下

如何从0开始用node写一个自己的命令行程序

图五

如何从0开始用node写一个自己的命令行程序

图六

发布npm包

1、创建npm账户(如果已有,略过该步骤)

注册地址: https://www.npmjs.com/signup

2、登陆npm login

3、发布 npm publish

每次发布时都需要更改package.json 中的version;

发布需将npm registry地址设为 http://registry.npmjs.org

npm config set registry http://registry.npmjs.org

参考资料

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Firefox getBoxObjectFor getBoundingClientRect联系
Oct 26 Javascript
仅IE支持clearAttributes/mergeAttributes方法使用介绍
May 04 Javascript
js数组的操作详解
Mar 27 Javascript
Egret引擎开发指南之创建项目
Sep 03 Javascript
点击A元素触发B元素的事件在IE8下会识别成A元素
Sep 04 Javascript
AngularJS递归指令实现Tree View效果示例
Nov 07 Javascript
node.js请求HTTPS报错:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解决方法
Dec 18 Javascript
Vue.js双向绑定操作技巧(初级入门)
Dec 27 Javascript
Easyui在treegrid添加控件的实现方法
Jun 23 Javascript
解决vue-cli项目webpack打包后iconfont文件路径的问题
Sep 01 Javascript
vue日历/日程提醒/html5本地缓存功能
Sep 02 Javascript
js实现表格数据搜索
Aug 09 Javascript
bootstrap与pagehelper实现分页效果
Dec 29 #Javascript
微信小程序实现滑动切换自定义页码的方法分析
Dec 29 #Javascript
vue实现分页组件
Jun 16 #Javascript
如何用RxJS实现Redux Form
Dec 29 #Javascript
Vue.js结合bootstrap前端实现分页和排序效果
Dec 29 #Javascript
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
Dec 29 #jQuery
javascript实现计算指定范围内的质数示例
Dec 29 #Javascript
You might like
怎么使 Mysql 数据同步
2006/10/09 PHP
PHP配置心得包含MYSQL5乱码解决
2006/11/20 PHP
php无限极分类递归排序实现方法
2014/11/11 PHP
php封装的连接Mysql类及用法分析
2015/12/10 PHP
基于PHP技术开发客服工单系统
2016/01/06 PHP
twig模板常用语句实例小结
2016/02/04 PHP
详解PHP防止直接访问.php 文件的实现方法
2017/07/28 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
2019/10/16 PHP
jQuery 使用手册(五)
2009/09/23 Javascript
URL地址中的#符号使用说明
2011/02/12 Javascript
捕获浏览器关闭、刷新事件不同情况下的处理方法
2013/06/02 Javascript
判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
2013/11/07 Javascript
nodejs连接mysql数据库及基本知识点详解
2018/03/20 NodeJs
JavaScript中0、空字符串、'0'是true还是false的知识点分享
2019/09/16 Javascript
如何正确解决VuePress本地访问出现资源报错404的问题
2020/12/03 Vue.js
node.js文件的复制、创建文件夹等相关操作
2021/02/05 Javascript
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
[01:00:49]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第二场 1月31日
2021/03/11 DOTA
简洁的十分钟Python入门教程
2015/04/03 Python
用Python进行行为驱动开发的入门教程
2015/04/23 Python
Python实现遍历数据库并获取key的值
2015/05/17 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
2017/03/12 Python
基于python中pygame模块的Linux下安装过程(详解)
2017/11/09 Python
python读取视频流提取视频帧的两种方法
2020/10/22 Python
python查找指定文件夹下所有文件并按修改时间倒序排列的方法
2018/10/21 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
2020/03/06 Python
Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式)
2020/03/18 HTML / CSS
英国经典球衣网站:Classic Football Shirts
2017/05/20 全球购物
伦敦著名的运动鞋综合商店:Footpatrol
2019/03/25 全球购物
西班牙三叶草药房:Farmacias Trébol
2019/05/03 全球购物
黄继光的英雄事迹材料
2014/02/13 职场文书
法院反腐倡廉心得体会
2014/09/09 职场文书
公务员群众路线专题民主生活会发言材料
2014/09/17 职场文书
拔河比赛队名及霸气口号
2015/12/24 职场文书
Python实现自动玩连连看的脚本分享
2022/04/04 Python