如何手动写一个命令行工具?
文章目录
- 前言
- 一、一个最简单的命令行工具
- 二、命令行解析工具
- 1.commander
- (1)option
- (2)version
- (3)command
- (4)argument
- 2.co-prompt
- 三、命令行美化提示依赖
- 1.readline
- 2.chalk
- 3.figlet
- 四、发布一个npm包
- 1、执行get registry
- 2、配置本地仓库
- 3、执行`npm adduser`
- 4、执行`npm publish`
- 5、执行成功
- 6、最后记得将本地仓库还原
- 总结
前言
如何手动写一个命令行甚至说发布一个npm包,这涉及到所需要提供服务的接口和优雅的命令行外观,本文将分为两部分去介绍构建命令行工具的方法。
提示:以下是本篇文章正文内容,下面案例可供参考
一、一个最简单的命令行工具
如何在命令行中输入一条命令,使它返回一句话?
首先我们需要建立一个文件夹,并在文件夹中npm init
,建立一个index.js
文件,在该文件中编写主要逻辑代码。
#!/usr/bin/env node
console.log('hello,world!')
/usr/bin/env就是告诉系统可以在PATH目录中查找。 所以配置#!/usr/bin/env node, 就是解决了不同的用户node路径不同的问题,可以让系统动态的去查找node来执行你的脚本文件。
要不要加–harmony?
文档里这么说,windows下不支持这么做。这个写法一般用于一些子命令的脚本中。
Use #! /usr/bin/env node --harmony in the subcommands scripts. (Note Windows does not support this pattern.)
Use the --harmony option when call the command, like node --harmony examples/pm publish. The --harmony option will be preserved when spawning subcommand process.
修改package.json
{"name": "mycli","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"author": "","bin":{"hi":"./index.js"},"license": "ISC"
}
二、命令行解析工具
1.commander
文档地址:https://www.npmjs.com/package/commander
(1)option
Options are defined with the .option() method, also serving as documentation for the options. Each option can have a short flag (single character) and a long name, separated by a comma or space or vertical bar (’|’).
意思是可以这么使用options的第一个参数,简写和完整形式之间可以用逗号,空格和‘|’连接。
program.option('-u, --username <username>', 'The user to authenticate as')
The two most used option types are a boolean option, and an option which takes its value from the following argument (declared with angle brackets like --expect ). Both are undefined unless specified on command line.
如果没有传参每个option返回的是一个布尔值,用于判断该option是否被执行;如果有传参,在定义时需要加上<>来进行参数传递。
The parsed options can be accessed by calling .opts() on a Command object, and are passed to the action handler. Multi-word options such as “–template-engine” are camel-cased, becoming program.opts().templateEngine etc.
如这段代码所示调用program的opts()
方法可以对options进行一些逻辑判断,从而给每个option不同的方法,注意option如果碰到一长串字符的选项会自动变成驼峰命名,在opt方法中调用参数的话,需要用模板字符串来返回。
var co = require('co');
var prompt = require('co-prompt');
var program = require('commander');
program.option('-d, --debug', 'output extra debugging').option('-s, --small', 'small pizza size').option('-p, --pizza-type <type>', 'flavour of pizza');program.parse(process.argv);
const options = program.opts();
if (options.debug) console.log(options);
console.log('pizza details:');
if (options.small) console.log('- small pizza size');
if (options.pizzaType) console.log(`- ${options.pizzaType}`);
如果没有设置默认值的话,控制台会返回这样的结果,C:\Users\15905\mycli>hi -p error: option '-p, --pizza-type <type>' argument missing
,所以我们可以在option里面增加参数,使得他有一个默认的返回值。
program.option('-c, --cheese <type>', 'add the specified type of cheese', 'blue');
program.parse();
console.log(`cheese: ${program.opts().cheese}`);
增加一些option
program.addOption(new Option('-s, --secret').hideHelp()).addOption(new Option('-t, --timeout <delay>', 'timeout in seconds').default(60, 'one minute')).addOption(new Option('-d, --drink <size>', 'drink size').choices(['small', 'medium', 'large']));
也可以在action中对options进行判断
program.arguments('<name>').option('-t, --title <honorific>', 'title to use before name').option('-d, --debug', 'display some debugging').action((name, options, command) => {if (options.debug) {console.error('Called %s with options %o', command.name(), options);}const title = options.title ? `${options.title} ` : '';console.log(`Thank-you ${title}${name}`);});
(2)version
program.version('0.0.1');
(3)command
和-option有些像,可以将它的参数传入action,因此逻辑可以在action里面处理。
如果和-option卸载一个段落,option会作为他的子命令出现。
program.command('clone <source> [destination]').description('clone a repository into a newly created directory').action((source, destination) => {console.log('clone command called');});program.parse();
(4)argument
在当前command下添加传入参数,假设有两个参数,一个是username,另外一个是password,第一个参数是必须要填的(否则不能判断第二个参数是那个),第二个参数可不填且有默认值。
program.version('0.1.0').arguments('<username> [password]').description('test command', {username: 'user to login',password: 'password for user, if required'}).action((username, password) => {console.log('username:', username);console.log('environment:', password || 'no password given');});program.parse()
输出如下
C:\Users\15905\mycli>hi
error: missing required argument 'username'C:\Users\15905\mycli>hi 'mouziyao' '123456'
username: 'mouziyao'
environment: '123456'C:\Users\15905\mycli>hi 'mouziyao'
username: 'mouziyao'
environment: no password givenC:\Users\15905\mycli>
2.co-prompt
文档地址:https://www.npmjs.com/package/co-prompt
通过这个依赖更好的实现了登录逻辑,异步获得了账户名和密码,prompt和prompt.password API可以调用并返回值,password提供了不显示具体数字的功能。
#!/usr/bin/env node
var co = require('co');
var prompt = require('co-prompt');
var program = require('commander');
program.version('0.0.2').arguments('<file>').option('-u, --username <username>', 'The user to authenticate as').option('-p, --password <password>', 'The user\'s password').action(function(file){co(function *(){var username = yield prompt('username: ');var password = yield prompt.password('password: ');console.log('user: %s password: %s file: %s',username, password, file);});}).parse(process.argv);
三、命令行美化提示依赖
1.readline
2.chalk
3.figlet
四、发布一个npm包
1、执行get registry
npm config get registry https://registry.npm.taobao.org/
2、配置本地仓库
npm config set registry=http://registry.npmjs.org
3、执行npm adduser
4、执行npm publish
5、执行成功
在npm官网的个人资料中能查看到发布的包
6、最后记得将本地仓库还原
npm config set registry=https://registry.npm.taobao.org/
总结
以上是手写命令行工具和发布的流程,对文档进行了一点解读,也动手制作了一个npm包,仅作参考。
如何手动写一个命令行工具?相关推荐
- 从 1 到完美,用 node 写一个命令行工具
从 1 到完美,用 node 写一个命令行工具 1. package.json 中的 bin 字段 现在,不管是前端项目还是 node 项目,一般都会用 npm 做包管理工具,而 package.js ...
- 用node写一个命令行工具
首先,大家在使用webpack,webpack-dev-server,babel-cli,vue-cli,npm这类工具的时候有没有思考过一个问题? 为什么我全局安装这个模块之后,就能在shell中使 ...
- 第三方模块——nodemon是一个命令行工具,用以辅助项目开发、nrm ( npm registry manager ):npm下载地址切换工具
什么是第三方模块 别人写好的.具有特定功能的.我们能直接使用的模块即第三方模块,由于第三方模块通常都是由多个文件组成并且被放置在一个文件夹中,所以又名包. 第三方模块 nodemon nodemon是 ...
- 用Python写一个命令行火车票查看器
Linux编程点击右侧关注,免费入门到精通! 作者丨protream https://www.jianshu.com/p/f411d7e10c41 当你想查询一下火车票信息的时候,你还在上12306官 ...
- Python 写一个命令行版的火车票查看器
用python另一个抢票神器,你get到了吗? 2017年时间飞逝,转眼间距离2018年春节还有不到1个月的时间,还在为抢不到火车票发愁吗?作为程序员的我们撸一个抢票软件可好? 难以想象的数据, 预示 ...
- 平均每个月帮节省你至少10%的时间,你还有理由不写实现命令行工具吗?
从零实现一个命令行工具 介绍: 本教程将带你从零实现一个命令行工具(command-line interface),对于你可能不理解的关键点,引(wo)入(xiang)外(tou)链(lan)让你&q ...
- GitBook是一个命令行工具(Node.js库),我们可以借用该工具使用Github/Git和Markdown来制作精美的图书,但它并不是一本关于Git的教程哟。...
GitBook是一个命令行工具(Node.js库),我们可以借用该工具使用Github/Git和Markdown来制作精美的图书,但它并不是一本关于Git的教程哟. 支持输出多种格式 GitBook支 ...
- PnPUtil (PnPUtil.exe) 是一个命令行工具,使管理员可以执行以下操作驱动程序包
C:\Users\Administrator>pnputil Microsoft PnP 工具 PNPUTIL [/add-driver <...> | /delete-driver ...
- 用nodejs写一个命令行应用-前言
前言 原本写了一大堆废话,但是想想自己看博客都直接跳过的.所以,话不多说,今天慢慢的实现一个基于nodejs的命令行hello world. 文章只是起到普及作用,目的在于让像我这样的小白知道有这些东 ...
最新文章
- 【力扣网练习题】有效的括号
- GitLab 8.3.3 发布 开源代码管理
- 10 Reasons Why Your Projects Should Use the Dojo
- 富文本NSMutableAttributedString用法大全
- Linux查看分析任务计划命令,详述Linux计划任务的 at和crontab的命令 以及如何查看crontab日志...
- python中正则表达式的用法_详解Python中的正则表达式的用法
- Excel精度问题。
- 【图论】spfa算法详解
- 网页扫雷html css js,GitHub - zsr204/Sweep: js + html + css 实现一个简单的扫雷~~ 附加 难度选择 计时 计雷数 开始 重新开始 功能...
- CHM文件制作方法及制作中遇到的坑
- 【许晓笛】别傻了,瀑布到来时,一句口号根本守不住你的币
- 2021秋招笔试(1)_乐鑫
- 仿照三元组的抽象数据类型分别写出抽象数据类型复数和有理数的定义
- LeetCode 325. Maximum Size Subarray Sum Equals k
- 系统平台运营热门店铺模式
- C++蓝桥杯贪心算法
- Vue ElementUI el-tree 修改节点收缩 icon
- 我参加NVIDIA Sky Hackathon(语音识别模型训练)
- 【pickle】详解python中的pickle模块(常用函数、示例)
- 联想-win7系统电脑开机提示Error 1962:No operating解决步骤