咱们天天都使用CLI程序(例如Terminal,cmd,Powershell等)进行软件开发。你使用的每一个工具本质上都是其余软件工程师的产品,咱们也能够制做本身的CLI工具。javascript
从零开始的简单CLI,让咱们开始吧!前端
要制做CLI,您须要制做两个文件java
添加Package.json 文件node
// package.json { "name": "my-cli", "version": "0.0.1", "description": "nodejs cli program", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "Dunizb", "license": "ISC" }
在package.json中,指定有关当前CLI程序的元数据, name
,version
,description
、author
等。web
建立 index.js 可执行文件面试
// index.js #! /usr/bin/env node console.log('Hello CLI');
那么,第一句话是什么意思?shell
在Linux和基于Unix的操做系统(例如Mac)中,#! / usr / bin / env node
不单单是一个注释。它使用在 /usr/bin/env
中注册的node命令来运行文件。npm
可是,在Windows中,这只是一个注释。json
添加bin属性segmentfault
咱们添加 bin
属性来实际运行 index.js 文件
// package.json { "name": "my-cli", "version": "0.0.1", ... ... "license": "ISC", "bin": { "cli": "./index.js" } }
bin
属性具备可执行文件,cli
命令要求运行 index.js
文件。
运行CLI
最后,让咱们运行CLI在控制台上打印Hello CLI。经过运行 npm i -g
在package.json中安装配置。
下次你在控制台上运行npm i -g
,您得到了updated 1 package...
,而不是added 1 package ...
。
而后运行 cli
命令。终于, Hello CLI!
你可能须要在Mac和Linux环境中附加 sudo
命令(即 sudo cli
),没有 node_modules
文件夹,由于你没有安装依赖项。
CLI中的Process.argv
// index.js #! /usr/bin/env node console.log('Hello CLI', process.argv);
你可使用 process.argv
在命令中找到选项,选项以数组形式显示。
你不须要在每次更新 index.js
代码时再次运行 npm i -g
,由于你已经将 package.json
的 bin
属性链接到 cli
命令和 index.js
文件。所以,每次调用 cli
命令时,均可以执行 index.js
文件(它不是来自缓存的,所以您能够运行新的更新内容)。
在终端中运行命令:
cli one two three four
结果
数组中的前两个元素是 node
和 cli
命令的路径。(对于Windows系统,它可能会打印出不一样的输出)输出可能会因您的计算机设置和环境而异(这取决于您在计算机上安装node和cli命令的位置)。
此外,one two three four
表示为数组类型
使用称为readline的本机Node模块从用户那里获取输入。
// index.js #! /usr/bin/env node const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); rl.question("你今天好吗(快乐, 悲伤)?", (answer) => { if(answer === "快乐") { console.log("听你这么说我很高兴"); } else if (answer === "悲伤") { console.log("但愿你明天感受好些") } else { console.log("你是快乐仍是悲伤?"); } rl.close(); });
你可使用 readline
模块中的 createInterface
方法建立 rl
对象。
process.stdin
和 process.stdout
是控制台输入和输出流。
readline
模块接受来自用户的输入,rl
对象提问法是向用户提问的一种方法,回调函数具备一个 answer
参数(来自用户的输入),若是全部 I/O(输入和输出)完成,则关闭 rl
对象。
咱们是否能够经过再次询问用户在这种状况下是否既不回答“高兴”也不回答“悲伤”来进一步提升CLI ?
#! /usr/bin/env node const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); console.clear(); const answerCallback = (answer) => { if (answer === "快乐") { console.log("听你这么说我很高兴"); rl.close(); } else if (answer === "悲伤") { console.log("但愿你明天感受好些"); rl.close(); } else { console.log("你是快乐仍是悲伤?"); rl.question("你今天好吗(快乐,悲伤)? ", answerCallback); } }; rl.question("你今天好吗(快乐,悲伤)?", answerCallback);
当程序开始使用 console. Clear
时清除控制台,而后使用 rl.question
方法询问用户输入并使用answerCallback
函数得到答案。
若是答案既不是悲伤也不是快乐,请清除控制台,而后递归再次提问,若是答案是悲伤或快乐,关闭输入控制台。
在本文中,咱们练习了一种制做简单的CLI工具(要求用户输入)的方法。但愿你喜欢阅读。
更多的高级和实用的例子能够从博客上找到进阶版CLI。
文章首发《前端外文精选》微信公众号
继续阅读其余高赞文章