如何从0开始用node写一个自己的命令行程序
作者:tiancai啊呆 发布时间:2024-05-03 15:56:26
前言
什么是命令行程序呢?像我们常见的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。
图一
实现
经过以上步骤我们已经基本搭好环境了,下面就可以开始写自己的逻辑了。
参数读取
process.argv
用来获取命令行参数。
修改index.js文件
#!/usr/bin/env node
console.log('git-tool')
console.log(process.argv)
然后执行 git-tool ss cd
,结果如下图所示:
图二
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
,效果如下:
图三
它会帮我们自动做一些事情,很方便。
思路
我们要实现统计代码提交量的目的,就必须借助git命令。
git log --author="username" --pretty=tformat: --numstat
该命令输出如下:
图四
第一列为增加的代码行数,第二列为删除的代码行数,第三列为改动的文件。
一些管道命令符可以处理这些数据,但是Windows系统不支持。
所以我的思路是把数据写到文件中,然后在逐行读取进行处理。
代码
具体实现细节就不展开了,有兴趣的可以去GitHub看源码。
最终实现效果如下
图五
图六
发布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
参考资料
手把手教你使用nodejs编写cli(命令行)
Node.js 命令行程序开发教程-阮一峰
来源:https://www.jianshu.com/p/57eaec6cf97b


猜你喜欢
- python实现收支的自动计算,能够查询每笔账款的消费详情,具体内容如下1、函数需要两个文件:一个类似钱包功能,存放钱;另一个用于记录每笔花
- 之前有个程序,里面有个时间部分是按照国内时区,也就是东八区,来写的,程序中定义了北京时间2点到八点进行检查;后面程序在国外机器上,例如说韩国
- 代码如下#!/bin/python#coding=utf-8#python-version=2.75  
- Ajax 是异步的JavaScript和XML的简称,是一种更新页面某部分的机制。它赋予了你从服务器获取数据后,更新页面某部分的权力,从而避
- 1、su – oracle 不是必需,适合于没有DBA密码时使用,可以不用密码来进入sqlplus界面。 2、sqlplus /
- 题目: 一个环形单链表,从头结点开始向后,指针每移动一个结点,就计数加1,当数到第m个节点时,就把该结点删除,然后继续从下一个节点开始从1计
- 目录前言Tips - django版本区别路由匹配无名分组&有名分组无名分组有名分组小提示反向解析路由不涉及分组的反向解析有名分组&
- 本文实例讲述了python引用DLL文件的方法。分享给大家供大家参考。具体分析如下:在python中调用dll文件中的接口比较简单,如我们有
- python查找多层嵌套字典的值def find_dic(item, key): if isinstance(it
- pymysql写入中文直接写入中文会出现错误。根据网上的方法,设置my.ini不成功sql = "INSERT INTO comp
- 实现原理 把所有需要延时加载的图片改成如下的格式:<img lazy_src="图片路径" border
- 如下所示:public function a(){ return $this->belongsTo('App\Mo
- 一、事务:事务是逻辑上的一组操作,要么都成功,要么都失败!——————————————————————————————————1、SQL执行
- 格式print <<EOFyou text go hereEOFsub usage{ pri
- 在ASP编程中,身份认证可以说是常要用到的。但怎么样才能做到认证的安全呢?表单提交页面:sub.htm  
- 本文实例为大家分享了Python实现远程操控电脑的具体代码,供大家参考,具体内容如下import poplib import sys imp
- 最近微信登录开放公测,为了方便微信用户使用,我们的产品也决定加上微信登录功能,然后就有了这篇笔记。根据需求选择相应的登录方式python实现
- 如下所示:import sysfrom PyQt5.QtWidgets import QMainWindow, QTextEdit, QAc
- 应用场景在数据表中,要记录的每条数据是什么时候创建的,不需要应用程序去特意记录,而是由数据库获取当前时间自动记录创建时间。在数据库中,要记录
- 也许已经有人发现可以这样写...CSS代码部分a.info { position: