实战 | 从零开始使用JavaScript制做本身的命令行(CLI工具)

1_R0mii3Di1F2ZCFSx1JJDPg.jpeg

咱们天天都使用CLI程序(例如Terminal,cmd,Powershell等)进行软件开发。你使用的每一个工具本质上都是其余软件工程师的产品,咱们也能够制做本身的CLI工具。javascript

从零开始的简单CLI,让咱们开始吧!前端

首先,让咱们制做一个简单的CLI工具,该工具会打印“ HelloWord”

要制做CLI,您须要制做两个文件java

  • package.json:将设置和配置指定入口
  • index.js:根据CLI命令的可执行文件

添加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程序的元数据, nameversiondescriptionauthor等。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.jsonbin 属性链接到 cli 命令和 index.js 文件。所以,每次调用 cli 命令时,均可以执行 index.js 文件(它不是来自缓存的,所以您能够运行新的更新内容)。

在终端中运行命令:

cli one two three four

结果

数组中的前两个元素nodecli 命令的路径。(对于Windows系统,它可能会打印出不一样的输出)输出可能会因您的计算机设置和环境而异(这取决于您在计算机上安装nodecli命令的位置)。

此外,one two three four 表示为数组类型

其次,经过“用户输入”与用户交互的简单CLI工具

使用称为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.stdinprocess.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。


文章首发《前端外文精选》微信公众号

subscribe2.png

继续阅读其余高赞文章


相关文章
相关标签/搜索