如何从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 相关文章推荐
jquery中使用ajax获取远程页面信息
Nov 13 Javascript
使用js的replace()方法查找字符示例代码
Oct 28 Javascript
js实现的黑背景灰色二级导航菜单效果代码
Aug 24 Javascript
完美实现八种js焦点轮播图(上篇)
Jul 18 Javascript
JavaScript面试题(指针、帽子和女朋友)
Nov 23 Javascript
原生JS实现图片轮播效果
Dec 26 Javascript
详解node-ccap模块生成captcha验证码
Jul 01 Javascript
微信小程序使用npm支持踩坑
Nov 07 Javascript
jQuery实现的老虎机跑动效果示例
Dec 29 jQuery
javascript实现对话框功能警告(alert 消息对话框)确认(confirm 消息对话框)
May 07 Javascript
vue项目前端知识点整理【收藏】
May 13 Javascript
JavaScript实现移动小精灵的案例代码
Dec 12 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
基于HTTP长连接的"服务器推"技术的php 简易聊天室
2009/10/31 PHP
php图像处理函数大全(推荐收藏)
2013/07/11 PHP
PHP中的插件机制原理和实例
2014/07/08 PHP
PHP文件下载实例代码浅析
2016/08/17 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
javascript Base类 包含基本的方法
2009/07/22 Javascript
javascript根据时间生成m位随机数最大13位
2014/10/30 Javascript
JavaScript中的索引数组、关联数组和静态数组、动态数组讲解
2014/11/08 Javascript
JS实现图文并茂的tab选项卡效果示例【附demo源码下载】
2016/09/21 Javascript
基于jQuery实现表格的排序
2016/12/02 Javascript
详解NodeJs支付宝移动支付签名及验签
2017/01/06 NodeJs
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
2018/03/13 Javascript
详解create-react-app 自定义 eslint 配置
2018/06/07 Javascript
Layui给数据表格动态添加一行并跳转到添加行所在页的方法
2018/08/20 Javascript
微信小程序实现跳转的几种方式总结(推荐)
2019/04/24 Javascript
python中lambda函数 list comprehension 和 zip函数使用指南
2014/09/28 Python
Python调用C语言开发的共享库方法实例
2015/03/18 Python
使用wxPython获取系统剪贴板中的数据的教程
2015/05/06 Python
你所不知道的Python奇技淫巧13招【实用】
2016/12/14 Python
python调用系统ffmpeg实现视频截图、http发送
2018/03/06 Python
python将秒数转化为时间格式的实例
2018/09/16 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
在django-xadmin中APScheduler的启动初始化实例
2019/11/15 Python
Pyqt5自适应布局实例
2019/12/13 Python
分享8款纯CSS3实现的搜索框功能
2017/09/14 HTML / CSS
深入理解HTML5定时器requestAnimationFrame的使用
2018/12/12 HTML / CSS
物业消防安全责任书
2014/07/23 职场文书
语文课外活动总结
2014/08/27 职场文书
观看《周恩来的四个昼夜》思想汇报
2014/09/12 职场文书
同意迁入证明模板
2014/10/26 职场文书
家长评语怎么写
2014/12/30 职场文书
高校自主招生自荐信2015
2015/03/04 职场文书
话题作文之学会尊重
2019/12/16 职场文书
MySQL获取所有分类的前N条记录
2021/05/07 MySQL
MySQL Router实现MySQL的读写分离的方法
2021/05/27 MySQL