如何从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 图片轮换效果
Jul 29 Javascript
JS动态增加删除UL节点LI及相关内容示例
May 21 Javascript
一个Action如何调用两个不同的方法
May 22 Javascript
jQuery中die()方法用法实例
Jan 19 Javascript
深入浅析JS的数组遍历方法(推荐)
Jun 15 Javascript
js实现九宫格的随机颜色跳转
Feb 19 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
Sep 07 Javascript
详解Vue之父子组件传值
Apr 01 Javascript
vue-router两种模式区别及使用注意事项详解
Aug 01 Javascript
js实现自动播放匀速轮播图
Feb 06 Javascript
vue微信分享插件使用方法详解
Feb 18 Javascript
如何用JavaScript学习算法复杂度
Apr 30 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模拟post行为代码总结(POST方式不是绝对安全)
2012/02/22 PHP
php之static静态属性与静态方法实例分析
2015/07/30 PHP
php使用str_shuffle()函数生成随机字符串的方法分析
2017/02/17 PHP
PHP通过文件保存和更新信息的方法分析
2019/09/12 PHP
javascript 页面只自动刷新一次
2009/07/10 Javascript
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
jQuery实现鼠标经过事件的延时处理效果
2020/08/20 Javascript
js print打印网页指定区域内容的简单实例
2016/11/01 Javascript
Vue分页组件实例代码
2017/04/17 Javascript
JavaScript的词法结构精华篇
2018/10/17 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
2019/06/07 Javascript
vue引用外部JS的两种种方法
2020/01/28 Javascript
[04:16]完美世界DOTA2联赛PWL S2 集锦第一期
2020/11/23 DOTA
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
对Python实现简单的API接口实例讲解
2018/12/10 Python
解决torch.autograd.backward中的参数问题
2020/01/07 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
2020/05/09 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
Python Sqlalchemy如何实现select for update
2020/10/12 Python
利用CSS3实现进度条的两种姿势详解
2017/03/21 HTML / CSS
美国男士内衣品牌:Tommy John
2017/12/22 全球购物
ABOUT YOU匈牙利:500个最受欢迎的时尚品牌
2019/07/19 全球购物
师范生的个人求职信范文
2014/01/04 职场文书
工程开工庆典邀请函
2014/02/01 职场文书
婚礼司仪主持词
2014/03/14 职场文书
奉献演讲稿范文
2014/05/21 职场文书
公司授权委托书范文
2014/08/02 职场文书
工作检讨书怎么写
2014/10/10 职场文书
2014年纪委工作总结
2014/12/05 职场文书
2015年元旦主持词结束语
2014/12/14 职场文书
保险内勤岗位职责
2015/04/13 职场文书
golang如何去除多余空白字符(含制表符)
2021/04/25 Golang
浅谈如何提高PHP代码质量之单元测试
2021/05/28 PHP