咱们每天都运用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程序的元数据, namevet c XrsiondescriptionP ^ s c w wauthor等。

创建 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 lcli 指令要求运转 inds B 9 )ex.js 文件。

运转CLL Y J ! h (I

最终,让咱们运转CLI在控制台上打印Hello CLI。经过运转 npm i -g 在package.json中装置装备。

【实战】从零开始使用JavaScript制作自己的命令行(CLI工具)

下次你在控制台上运转 npm i -g,您取得了 updated 1d Y 0 : package...,而不是_ K * 7 U 7 v 4 added. - 5 1 8 : 1 package ...

然后运转 cli 指令。4 r ( H ? k # B总算, Hello CLI!

【实战】从零开始使用JavaScript制作自己的命令行(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.jsonbin 特点连接到 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

成果

【实战】从零开始使用JavaScript制作自己的命令行(CLI工具)

数组中的前两个元素nodec- 1 4 5li 指令的途径。(关于Windows体系,它可能会打印出不同的输出)输出可能会因您! s f I r的核算机设置和环境而异(这取决于您在核算机上装置nodecli指令的位置)。

此外,one two thrn 6 Y Pee fouC ( $ Y M g F 6rY 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.stdinprocess.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控制台。

【实战】从零开始使用JavaScript制作自己的命令行(CLI工具)

总结

在本文中,咱们练习了一种h E 1 z制造简略的CLI东西(要求用户输入)的办法。期望你喜欢阅览。

更多的高档和有用的比如能够从博客上找到进阶版CLI。

【实战】从零开始使用JavaScript制作自己的命令行(CLI工具)

原文:medium.com/javascript-…

作者:GP Lee


假如对你有所启发和帮助,能够点个关注、保藏、转发,也[ % I I能够留言评论,这是对作者的最大鼓舞。

作者简介:Web前端工程师,全栈开发工程师、持续学习者。

【实战】从零开始使用JavaScript制作自己的命令行(CLI工具)