如何从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 相关文章推荐
分享Javascript中最常用的55个经典小技巧
Nov 29 Javascript
javascipt:filter过滤介绍及使用
Sep 10 Javascript
Js实现网页键盘控制翻页的方法
Oct 30 Javascript
JavaScript基础知识及常用方法总结
Jan 10 Javascript
JS实现把鼠标放到链接上出现滚动文字的方法
Apr 06 Javascript
vue.js指令v-model使用方法
Mar 20 Javascript
教你如何用node连接redis的示例代码
Jul 12 Javascript
利用es6 new.target来对模拟抽象类的方法
May 10 Javascript
小程序云开发如何实现图片上传及发表文字
May 17 Javascript
详解Angular Karma测试的持续集成实践
Nov 15 Javascript
小程序实现录音功能
Sep 22 Javascript
JavaScript实现班级抽签小程序
May 19 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
简单的php写入数据库类代码分享
2011/07/26 PHP
php数组函数序列之array_sum() - 计算数组元素值之和
2011/10/29 PHP
PHP实现批量修改文件名的方法示例
2019/09/18 PHP
Avengerls vs KG BO3 第一场2.18
2021/03/10 DOTA
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
简述AngularJS相关的一些编程思想
2015/06/23 Javascript
浅谈jQuery的offset()方法及示例分享
2015/07/17 Javascript
javascript实现的闭包简单实例
2015/07/17 Javascript
浅谈JavaScript 标准对象
2016/06/02 Javascript
javascript简单实现等比例缩小图片的方法
2016/07/27 Javascript
深入理解Node.js 事件循环和回调函数
2016/11/02 Javascript
用纯Node.JS弹出Windows系统消息提示框实例(MessageBox)
2017/05/17 Javascript
Vue2路由动画效果的实现代码
2017/07/10 Javascript
微信小程序 rich-text的使用方法
2017/08/04 Javascript
bootstrap-table组合表头的实现方法
2017/09/07 Javascript
React Hooks的深入理解与使用
2018/11/12 Javascript
一次微信小程序内地图的使用实战记录
2019/09/09 Javascript
在Python中使用模块的教程
2015/04/27 Python
Python将DataFrame的某一列作为index的方法
2018/04/08 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
2018/04/30 Python
Django用户认证系统 User对象解析
2019/08/02 Python
python异常触发及自定义异常类解析
2019/08/06 Python
解决django model修改添加字段报错的问题
2019/11/18 Python
PyTorch实现AlexNet示例
2020/01/14 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
2020/01/16 Python
Html5实现如何在两个div元素之间拖放图像
2013/03/29 HTML / CSS
Html5页面中的返回实现的方法
2018/02/26 HTML / CSS
德国富尔达运动鞋店:43einhalb
2020/12/25 全球购物
机械设计毕业生自荐信
2014/02/02 职场文书
五一手机促销方案
2014/03/08 职场文书
搞笑征婚广告词
2014/03/17 职场文书
建筑学专业自荐书
2014/07/09 职场文书
幼儿园教师岗位职责
2015/04/02 职场文书
Redis Cluster 集群搭建你会吗
2021/08/04 Redis
Python Django模型详解
2021/10/05 Python
canvas实现贪食蛇的实践
2022/02/15 Javascript