如何从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 相关文章推荐
JS运行耗时操作的延时显示方法
Nov 19 Javascript
js弹出的对话窗口永远保持居中显示
Dec 15 Javascript
jQuery封装的获取Url中的Get参数示例
Nov 26 Javascript
javascript删除数组重复元素的方法汇总
Jun 24 Javascript
jQuery实现图片上传和裁剪插件Croppie
Nov 29 Javascript
基于jQuery实现滚动刷新效果
Jan 09 Javascript
JS正则表达式判断有效数实例代码
Mar 13 Javascript
解决jquery appaend元素中id绑定事件失效的问题
Sep 12 jQuery
Element-ui table中过滤条件变更表格内容的方法
Mar 02 Javascript
解决vue-cli创建项目的loader问题
Mar 13 Javascript
Vue微信项目按需授权登录策略实践思路详解
May 07 Javascript
Vue路由守卫及页面登录权限控制的设置方法(两种)
Mar 31 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/06/09 PHP
php实现的数字验证码及数字运算验证码
2015/07/30 PHP
php获取flash尺寸详细数据的方法
2016/11/12 PHP
关于php几种字符串连接的效率比较(详解)
2017/02/22 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
prototype Element学习笔记(Element篇三)
2008/10/26 Javascript
js仿百度贴吧验证码特效实例代码
2014/01/16 Javascript
JS cookie中文乱码解决方法
2014/01/28 Javascript
jQuery动画效果animate和scrollTop结合使用实例
2014/04/02 Javascript
javascript基于HTML5 canvas制作画箭头组件
2014/06/25 Javascript
JavaScript对象之深度克隆介绍
2014/12/08 Javascript
JavaScript模拟push
2016/03/06 Javascript
AngularJs ng-route路由详解及实例代码
2016/09/14 Javascript
js编写三级联动简单案例
2016/12/21 Javascript
AngularJS表单基本操作
2017/01/09 Javascript
浅谈javascript中的 “ && ” 和 “ || ”
2017/02/02 Javascript
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
微信小程序实现底部导航
2018/11/05 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
js模拟F11页面全屏显示
2019/09/17 Javascript
微信小程序实现吸顶特效
2020/01/08 Javascript
vue动态渲染svg、添加点击事件的实现
2020/03/13 Javascript
利用Vue的v-for和v-bind实现列表颜色切换
2020/07/17 Javascript
[05:26]2014DOTA2西雅图国际邀请赛 iG战队巡礼
2014/07/07 DOTA
pytorch 获取tensor维度信息示例
2020/01/03 Python
Django ModelForm组件原理及用法详解
2020/10/12 Python
推荐10个CSS3 制作的创意下拉菜单效果
2014/02/11 HTML / CSS
德国PC硬件网站:CASEKING
2016/10/20 全球购物
英国排名第一的LED灯泡网站:LED Bulbs
2019/09/03 全球购物
2015年英语教师工作总结
2015/05/20 职场文书
中学语文教学反思
2016/02/16 职场文书
Python中Cookies导出某站用户数据的方法
2021/05/17 Python
解析Java异步之call future
2021/06/14 Java/Android
Java中PriorityQueue实现最小堆和最大堆的用法
2021/06/27 Java/Android
Python pandas之求和运算和非空值个数统计
2021/08/07 Python
JavaScript展开运算符和剩余运算符的区别详解
2022/02/18 Javascript