如何从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在IE和FireFox中的不同表现简析
Dec 03 Javascript
jQuery on()方法绑定动态元素的点击事件无响应的解决办法
Jul 07 Javascript
Bootstrap选项卡动态切换效果
Nov 28 Javascript
js实现手机发送验证码功能
Mar 13 Javascript
JS组件系列之MVVM组件构建自己的Vue组件
Apr 28 Javascript
JS简单实现自定义右键菜单实例
May 31 Javascript
JavaScript面向对象编程小游戏---贪吃蛇代码实例
May 15 Javascript
利用JavaScript将Excel转换为JSON示例代码
Jun 14 Javascript
操作按钮悬浮固定在微信小程序底部的实现代码
Aug 02 Javascript
解决LayUI数据表格复选框不居中显示的问题
Sep 25 Javascript
解决ele ui 表格表头太长问题的实现
Nov 13 Javascript
vue 实现基础组件的自动化全局注册
Dec 25 Vue.js
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
全国FM电台频率大全 - 3 河北省
2020/03/11 无线电
php获取发送给用户的header信息的方法
2015/03/16 PHP
php图片水印添加、压缩、剪切的封装类实现
2020/04/18 PHP
PHP面向对象详解(三)
2015/12/07 PHP
YII框架常用技巧总结
2019/04/27 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
TNC vs BOOM BO3 第二场2.13
2021/03/10 DOTA
再谈ie和firefox下的document.all属性
2009/10/21 Javascript
javascript或asp实现的判断身份证号码是否正确两种验证方法
2009/11/26 Javascript
分享20款好玩的jQuery游戏
2011/04/17 Javascript
javascript中文本框中输入法切换的问题
2013/12/10 Javascript
jQuery调用WebMethod(PageMethod) NET2.0的方法
2016/04/15 Javascript
[原创]Javascript 实现广告后加载 可加载百度谷歌联盟广告
2016/05/11 Javascript
js生成随机数(指定范围)的实例代码
2016/07/10 Javascript
PHP实现记录代码运行时间封装类实例教程
2017/05/08 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
Webpack之tree-starking 解析
2018/09/11 Javascript
Vue中的$set的使用实例代码
2018/10/08 Javascript
利用Angular7开发一个Radio组件的全过程
2019/07/11 Javascript
JS面向对象编程实现的Tab选项卡案例详解
2020/03/03 Javascript
原理深度解析Vue的响应式更新比React快
2020/04/04 Javascript
如何利用node转发请求详解
2020/09/17 Javascript
javascript canvas封装动态时钟
2020/09/30 Javascript
Python爬豆瓣电影实例
2018/02/23 Python
Python如何省略括号方法详解
2020/03/21 Python
python 识别登录验证码图片功能的实现代码(完整代码)
2020/07/03 Python
美国演唱会订票网站:Ticketmaster美国
2017/10/05 全球购物
介绍一下XMLHttpRequest对象
2012/02/12 面试题
人身意外保险授权委托书
2014/10/01 职场文书
2015年安全生产责任书
2015/01/30 职场文书
消防隐患整改通知书
2015/04/22 职场文书
单位计划生育责任书
2015/05/09 职场文书
退货证明模板
2015/06/23 职场文书
详解Laravel制作API接口
2021/05/31 PHP
Redis特殊数据类型Geospatial地理空间
2022/06/01 Redis
基于CSS制作创意端午节专属加载特效
2022/06/01 HTML / CSS