如何从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中把数字转换为字符串的程序代码
Jun 19 Javascript
jquery实现弹出div,始终显示在屏幕正中间的简单实例
Mar 08 Javascript
使用Jquery获取带特殊符号的ID 标签的方法
Apr 30 Javascript
jQuery中ready事件用法实例
Jan 19 Javascript
JS阻止事件冒泡行为和闭包的方法
Jun 16 Javascript
jQuery对checkbox 复选框的全选全不选反选的操作
Aug 09 Javascript
JavaScript 用fetch 实现异步下载文件功能
Jul 21 Javascript
bootstrap中selectpicker下拉框使用方法实例
Mar 22 Javascript
详解vue.js下引入百度地图jsApi的两种方法
Jul 27 Javascript
js canvas画布实现高斯模糊效果
Nov 27 Javascript
JS实现导航栏楼层特效
Jan 01 Javascript
Vue3项目打包后部署到服务器 请求不到后台接口解决方法
Feb 06 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实现小型站点广告管理(修正版)
2006/10/09 PHP
php网页版聊天软件实现代码
2016/08/12 PHP
PHP调用其他文件中的类
2018/04/02 PHP
php+iframe 实现上传文件功能示例
2020/03/04 PHP
JS 面向对象的5钟写法
2009/07/31 Javascript
输入密码检测大写是否锁定js实现代码
2012/12/03 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
2013/01/24 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
2014/06/17 Javascript
Javascript模仿淘宝信用评价实例(附源码)
2015/11/26 Javascript
jQuery实现的指纹扫描效果实例(附演示与demo源码下载)
2016/01/26 Javascript
详解vue-cli之webpack3构建全面提速优化
2017/12/25 Javascript
详解ES6通过WeakMap解决内存泄漏问题
2018/03/09 Javascript
手把手教你vue-cli单页到多页应用的方法
2018/05/31 Javascript
JS/HTML5游戏常用算法之追踪算法实例详解
2018/12/12 Javascript
微信小程序wepy框架学习和使用心得详解
2019/05/24 Javascript
详解vue项目中实现图片裁剪功能
2019/06/07 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
JQuery省市联动效果实现过程详解
2020/05/08 jQuery
详解Typescript 内置的模块导入兼容方式
2020/05/31 Javascript
[01:03]悬念揭晓 11月26日DOTA2完美盛典不见不散
2017/11/23 DOTA
浅谈Python中的bs4基础
2018/10/21 Python
python字典的遍历3种方法详解
2019/08/10 Python
解析python的局部变量和全局变量
2019/08/15 Python
通过实例了解Python str()和repr()的区别
2020/01/17 Python
Python递归求出列表(包括列表中的子列表)的最大值实例
2020/02/27 Python
日本高岛屋百货购物网站:TAKASHIMAYA
2019/03/24 全球购物
来自世界各地的饮料:Flavourly
2019/05/06 全球购物
英国设计师珠宝网站:Joshua James Jewellery
2020/03/01 全球购物
工地门卫岗位职责
2013/12/30 职场文书
艺术设计专业毕业生推荐信
2014/07/08 职场文书
工作违纪检讨书范文
2015/01/26 职场文书
初三数学教学反思
2016/02/17 职场文书
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL
ElementUI实现el-form表单重置功能按钮
2021/07/21 Javascript
Python OpenGL基本配置方式
2022/05/20 Python
Spring Boot 的创建和运行示例代码详解
2022/07/23 Java/Android