咱们每天都运用CLI程序(例如Terminal,cmd,Powershell等)进行软件开发。你运用的每个东西本质上都是其他软件工程师的产品,咱们也能够制造自己的CLI东西。
从零开端的简略CLI; v C,让咱们开端吧!
首先,让咱们制造一个简略的CLI东西,该东西会打印“ HelloWord”
要制造CLI,您需求制造两个文件
- package.json:将设置和装备指定入口
- index.js:依据CLI指令的可履行文件
增加Package.json 文件
// package.jsonx J Q _ ^ c
{
"name": "my-cli",
"verK o I l vsion": "0.0.1",
"desr + ) ^ Hcription": "nodejs cli{ X c I / R program",
"main": "index.js",
"scripts": {
"test": "echo "A N % t S Y a * sError: no test specified" && exit 1"
},
"author"y J 6 p ! u ! + &: "Dunizb",
"license": "ISC"
}
在package.json中,指定有关当时CLI程序的元数据, name
,vet c Xrsion
,descriptionP ^ s c w w
、author
等。
创建 index.js 可履行文件
// index.js
#! /usr/bin/env node
console.log('Hello CLI');
那么,第一句话是什么意X i L 2 U t思?
在Linux和基于Unix的操作体系(例如Mac)中,#! / usr / bin / env node
不仅仅是一个注释。它运用在 /usr/bi8 u ! }n/enl l T i l h j %v
中注册的node指令来运转文件。
可是,在Windows中,这只是X ~ : T W D C一个a & c ? N e J e注释。
增加bin特点
咱们增加 bin
特点来实际运转 iC 2 m S s J = @ 4ndex.js 文件
// package.json
{
"name": "my-cli",
"version: h H r w J": "0.0.1",
...
...
"license": "ISC",
"bin": {
"cli": "./index.js"
}
}
bin
特点具有可履行文件, d $ ) _ _ L f l,cli
指令要求运转 inds B 9 )ex.js
文件。
运转CLL Y J ! h (I
最终,让咱们运转CLI在控制台上打印Hello CLI。经过运转 npm i -g
在package.json中装置装备。
下次你在控制台上运转
npm i -g
,您取得了updated 1d Y 0 : package...
,而不是_ K * 7 U 7 v 4added. - 5 1 8 : 1 package ...
。
然后运转 cli
指令。4 r ( H ? k # B总算, Hello CLI!
你可能需求在Mac和Linux环境中附加 sudo
指令(即 sudo cli
),没有 node_Z : modules
文件夹,由于你没有装置依靠项。U a H B F ~ ~ g K
CLI中的Process.argv
// index.js
#! /usr/bin/env nod5 | _ % l @ pe
console.log('Hello CLI', procesz x K 7 % ^ 4 ls.argv);
你能够运用 process.argv
在指令中找到选项,选项以数组方式显现。
你不需求在每次更新 i} ? ` D g 0 T Zndex.js
代码时再次运转 npm i -g
,由于你现已将 packa` l J = . t r # 3g! j ) h L E N Xe.json
的 bin
特点连接到 cli
指令和 index.js
文件。因而,每次调用 cli
指令时,都能够履行 index.j0 8 * y D ; ] Zsv ; K u _ q k n D
文件(它不是来自缓存的,因而您能够运转新的更新内容)。
在终O m ( U 7 % v s端中运转指令:
cli one two thre% y ( g B + : / ne four
成果
数组中的前两个元素是 node
和 c- 1 4 5li
指令的途径。(关于Windows体系,它可能会打印出不同的输出)输出可能会因您! s f I r的核算机设置和环境而异(这取决于您在核算机上装置node和cli指令的位置)。
此外,one two thrn 6 Y Pee fouC ( $ Y M g F 6r
表Y m e示为数组类型
其次,经过“用户输入”与用户交互的简略CLI东西
运用称为readline的本机Node模块从用户那里获取输入。
// index.js
#! /usr/bin/env node
const readline = require('readli, v Rne');
const rl = readline.createInterface({| S O H @ v z R
input: process.stdin,
output: proce Z x G 7 A b dss.stdout,
});
rl.question("你今天好吗(高兴, 哀痛)?", (answer) => {
if(answer === "高兴") {
console.log("听你这么说我很高兴H j e I # f T");
} else iG } Af (answer === "哀痛") {
console.log("期望你明天感觉好些")
} else {? 7 + n d
console.log("你是高兴 D . p s O 8仍是哀痛?");
}
rl.close();
});
你能够运用 readline
模块中的 createInterface
办法创建 rl
目标。
process.stdin
和 process.stdout
是控制台输入和W B M ] 4 x 3 q输出流。
readline
模块接受来自用户的输入,rl
目标e F 2 G发问法是向用户发问的一种办法,回调函数具有一个 answer
参数(来自用户的输入),假如一切 I/O(输入和输出)完结,则封闭 rl
目标。
咱们是否能够经过再次问询用户在这种情况下是否既不答复“高兴”也不答复“哀痛”来进一步进步CLI ?
再次问询用户时,是否答复过错g ! g E P
#! /usr/bin/env node+ H j [ s $
const readline = require('readline');
const rl = readline.createInterface({
input: prh G # & ) P . t )o1 N 2 4 X Scess.stdin,
output: process.stdout,
});
console.clear();
const ansK W 2 a z K ]werCallback = (aM l 9 9 [ C u Tnswer) =- ~ x 5> {
if (answer === "高兴") {
console.log("听你这么说我很高兴");
rl.close();
} else if (answer === "6 2 M B哀痛I o h o M ! @ q ") {
console.log("期望你明天感觉z # K s i o g J B好些");
rl.close();
} else {
console.log("你是高兴仍是哀痛?");
rl.question("你今天好吗(高兴,j O L哀痛)? ", answerCallbC ` C K } O A G wack);
}
};
rl.ques5 l X U ktion("你今天好吗(高兴,哀痛)?", answerC{ W ^ ^aU n 4 Dllback)2 ? T @ w ? 1 U;
当程序@ { t # . o @开端运用 console. Clear
时铲除, 0 x v Z 9 8 [控制台,然后运用 rl.questia t k J S 7 & ^ ion
办法问询用户输入并运用answerCallback
函数取得答案。
假如b / o i A q q答案既不是哀E n e 1 C ~痛也不是高兴0 I : z,请铲除控制台,n E z 2 6然后递归再次发问@ J A y * a Q,假如答案是哀痛或高兴,封闭输入i ? ] s 7 + * } 2控制台。
总结
在本文中,咱们练习了一种h E 1 z制造简略的CLI东西(要求用户输入)的办法。期望你喜欢阅览。
更多的高档和有用的比如能够从博客上找到进阶版CLI。
原文:medium.com/javascript-…
作者:GP Lee
假如对你有所启发和帮助,能够点个关注、保藏、转发,也[ % I I能够留言评论,这是对作者的最大鼓舞。
作者简介:Web前端工程师,全栈开发工程师、持续学习者。